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