HashSet基于HashMap。如果我们看一下HashSet<E>实现,则所有内容都在下管理HashMap<E,Object>。<E>用作的键HashMap。而且我们知道这HashMap不是线程安全的。这就是为什么我们使用ConcurrentHashMapJava。基于此,我感到困惑的是,为什么我们没有应该基于的ConcurrentHashSet ConcurrentHashMap?还有什么我想念的吗?我需要Set在多线程环境中使用。另外,如果我想创建自己的作品,是否ConcurrentHashSet可以通过仅替换HashMapto ConcurrentHashMap并将其余内容保持不变来实现?
3 回答

慕村9548890
TA贡献1884条经验 获得超4个赞
没有内置类型,ConcurrentHashSet因为您总是可以从地图中导出集合。由于地图的类型很多,因此您可以使用一种方法从给定的地图(或地图类)生成一个集合。
在Java 8之前,您可以通过使用生成由并发哈希图支持的并发哈希集。 Collections.newSetFromMap(map)
在Java 8(由@马特指出的),你可以得到一个并发的哈希集合视图通过ConcurrentHashMap.newKeySet()。这比旧版本newSetFromMap要简单一些,旧版本要求您传入一个空的地图对象。但这是特定于ConcurrentHashMap。
无论如何,Java设计人员每次创建新的地图接口时都可以创建一个新的set接口,但是当第三方创建自己的地图时,该模式将无法实施。最好有静态方法来派生新的集合。即使您创建自己的地图实现,该方法也始终有效。

沧海一幻觉
TA贡献1824条经验 获得超5个赞
Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
添加回答
举报
0/150
提交
取消