java - 为什么没有针对 ConcurrentHashMap 的 ConcurrentHashSet

标签 java collections concurrency hashmap hashset

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/

相关文章:

java - 在文本文件中写入多行(java)

Javafx stage resizeable false 和 maximized true 隐藏任务栏

java - 如何从java中的任何目录和对话框中读取文本文件?

java - 在创建 ArrayList 时添加元素

java - 防止一个操作被不同的服务器多次调用

java - 如何在 Java 中比较两个列表并根据每个组合打印结果?

哈希linkedHashSet的java意义

c# - 优化 C# 代码片段、ObservableCollection 和 AddRange

java - ConcurrentHashMap 和 putAll() 方法

java - 高性能非阻塞有序消息处理程序