HashSet基于HashMap。

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

<E>用作HashMap的键。

我们知道HashMap不是线程安全的。这就是为什么我们在Java中有ConcurrentHashMap。

基于此,我很困惑,为什么我们没有一个应该基于ConcurrentHashMap的ConcurrentHashSet ?

我还遗漏了什么吗?我需要在多线程环境中使用Set。

此外,如果我想创建自己的ConcurrentHashSet,我可以通过将HashMap替换为ConcurrentHashMap并保留其余部分来实现它吗?


当前回答

我们在io中有ConcurrentHashSet。Vertx,可以用来对抗java。util ConcurrentHashMap。 https://www.javadoc.io/static/io.vertx/vertx-core/3.0.0/io/vertx/core/impl/ConcurrentHashSet.html

其他回答

就像Ray total提到的,这很简单:

Set<String> myConcurrentSet = ConcurrentHashMap.newKeySet();

番石榴15你也可以简单地使用:

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

我们在io中有ConcurrentHashSet。Vertx,可以用来对抗java。util ConcurrentHashMap。 https://www.javadoc.io/static/io.vertx/vertx-core/3.0.0/io/vertx/core/impl/ConcurrentHashSet.html

看起来Java通过ConcurrentSkipListSet提供了一个并发Set实现。SkipList Set只是一种特殊的集合实现。它仍然实现了Serializable, Cloneable, Iterable, Collection, NavigableSet, Set, SortedSet接口。如果您只需要Set接口,这可能对您有用。