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