为了账号安全,请及时绑定邮箱和手机立即绑定

为什么没有针对ConcurrentHashMap的ConcurrentHashSet

为什么没有针对ConcurrentHashMap的ConcurrentHashSet

慕哥6287543 2019-11-21 14:29:47
HashSet基于HashMap。如果我们看一下HashSet<E>实现,则所有内容都在下管理HashMap<E,Object>。<E>用作的键HashMap。而且我们知道这HashMap不是线程安全的。这就是为什么我们使用ConcurrentHashMapJava。基于此,我感到困惑的是,为什么我们没有应该基于的ConcurrentHashSet ConcurrentHashMap?还有什么我想念的吗?我需要Set在多线程环境中使用。另外,如果我想创建自己的作品,是否ConcurrentHashSet可以通过仅替换HashMapto ConcurrentHashMap并将其余内容保持不变来实现?
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

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


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


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


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


查看完整回答
反对 回复 2019-11-21
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 1729 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信