为什么没有针对ConcurrentHashMap的ConcurrentHashSet?| Java Debug 笔记

467 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

为什么没有针对ConcurrentHashMap的ConcurrentHashSet?

HashSet基于HashMap。

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

用作的键HashMap。

而且我们知道这HashMap不是线程安全的。这就是我们使用ConcurrentHashMapJava的原因。

基于此,我感到困惑的是,为什么我们没有应该基于的ConcurrentHashSet ConcurrentHashMap?

还有什么我想念的吗?我需要Set在多线程环境中使用。

另外,如果我想创建自己的应用程序,是否ConcurrentHashSet可以通过仅替换HashMaptoConcurrentHashMap并将其余部分保持原样来实现?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

没有内置类型,ConcurrentHashSet因为您总是可以从Map中派生集合。由于地Map类型很多,因此您可以使用一种方法从给定的地图(或地图类)生成一个集合。

在Java 8之前,您可以使用生成由并发哈希图支持的并发哈希集。 Collections.newSetFromMap(map)

在Java 8(由@马特指出的),你可以得到一个并发的哈希集合视图通过ConcurrentHashMap.newKeySet()。这比旧版本newSetFromMap要简单一些,旧版本要求您传入一个空的Map对象。但这是特定于的ConcurrentHashMap。

无论如何,Java设计人员每次创建新的Map接口时都可以创建一个新的set接口,但是当第三方创建自己的Map时,该模式将无法实施。最好有静态的方法来推导新的集合。即使您创建自己的Map实现,该方法也始终有效。

高分回答:

Set<String> mySet = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());tion<User> authorizedUsers = filter(allUsers, isAuthorized);

文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/6…

作者建议: ConcurrentHashMap可以转换成set的

hashmap很多讲的,比如jdk1.7的头插法成环问题,1.8解决的尾插法,hashmap的初始容量,扩容,hash算法、线程安全问题(concurrentHashMap-cas+sync), 还有一个就是计算size.

JDK1.8 size 是通过对 baseCount 和 counterCell 进行 CAS 计算,最终通过 baseCount 和 遍历 CounterCell 数组得出 size。主要是思想通过数组的方式,提高了吞吐。

建议读几遍源码,加深印象。

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️