HashSet 基于 HashMap。
如果我们查看 HashSet<E>
实现,一切都在HashMap<E,Object>
下管理.
<E>
用作 HashMap
的键.
我们知道 HashMap
不是线程安全的。这就是为什么我们有 ConcurrentHashMap
在 Java 中。
基于此,我很困惑 为什么我们没有应该基于 ConcurrentHashMap
的 ConcurrentHashSet ?
还有什么我想念的吗?我需要使用 Set
在多线程环境中。
另外,如果我想创建自己的 ConcurrentHashSet
我可以通过替换 HashMap
来实现吗?至ConcurrentHashMap
其余部分保持原样?
最佳答案
ConcurrentHashSet
没有内置类型,因为您总是可以从 map 中派生一个集合。由于 map 的类型很多,您可以使用一种方法从给定的 map (或 map 类)生成一组。
在 Java 8 之前,您可以使用 Collections.newSetFromMap(map)
生成由并发 HashMap 支持的并发哈希集。
在 Java 8 中(@Matt 指出),您可以通过 ConcurrentHashMap.newKeySet()
获得并发散列集 view .这比旧的 newSetFromMap
要简单一些,旧的 newSetFromMap
要求您传入一个空的 map 对象。但它是 ConcurrentHashMap
特有的。
无论如何,Java 设计者可以在每次创建新的 map 界面时创建一个新的集合界面,但是当第三方创建自己的 map 时,这种模式将无法实现。最好有派生新集合的静态方法;即使您创建自己的 map 实现,这种方法也始终有效。
关于java - 为什么没有针对 ConcurrentHashMap 的 ConcurrentHashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992608/