猿问
下载APP

为什么没有针对ConcurrentHashMap的ConcurrentHashSet

HashSet基于HashMap。


如果我们看一下HashSet<E>实现,则所有内容都在下管理HashMap<E,Object>。


<E>用作的键HashMap。


而且我们知道这HashMap不是线程安全的。这就是为什么我们使用ConcurrentHashMapJava。


基于此,我感到困惑的是,为什么我们没有应该基于的ConcurrentHashSet ConcurrentHashMap?


还有什么我想念的吗?我需要Set在多线程环境中使用。


另外,如果我想创建自己的作品,是否ConcurrentHashSet可以通过仅替换HashMapto ConcurrentHashMap并将其余内容保持不变来实现?


慕哥6287543
浏览 91回答 3
3回答

慕村9548890

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

沧海一幻觉

Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());

犯罪嫌疑人X

看起来Java提供了一个ConcurrentSkipListSet并发Set实现。一个SkipList集只是一种特殊的一整套实施。它仍然实现Serializable,Cloneable,Iterable,Collection,NavigableSet,Set,SortedSet接口。如果只需要Set界面,这可能对您有用。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答