首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConcurrentHashMap.newKeySet() vs Collections.newSetFromMap()

ConcurrentHashMap.newKeySet() vs Collections.newSetFromMap()
EN

Stack Overflow用户
提问于 2015-08-17 23:46:09
回答 2查看 10.5K关注 0票数 20

Java8引入了一种获得并发Set实现的新方法

代码语言:javascript
复制
// Pre-Java-8 way to create a concurrent set
Set<String> oldStyle = Collections.newSetFromMap(new ConcurrentHashMap<>());
// New method in Java 8
Set<String> newStyle = ConcurrentHashMap.newKeySet();

有什么理由选择新的方法吗?

有什么优点/缺点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 00:01:11

ConcurrentHashMap.newKeySet()应该更有效率,因为它删除了单个级别的间接性。Collections.newSetFromMap(map)主要基于将操作重定向到map.keySet(),但ConcurrentHashMap.newKeySet()非常接近map.keySet()本身(只是增加了支持)。

至于功能,我看不出有什么不同。

票数 12
EN

Stack Overflow用户

发布于 2015-08-18 00:01:19

ConcurrentHashMap.newKeySet()只是一个比Collections.newSetFromMap(new ConcurrentHashMap<>())更广泛的特性的一部分。

如果你看这个例子,区别就会变得很明显:

代码语言:javascript
复制
Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");

现在不是映射到Boolean.TRUE,而是在向Set添加新值时添加值"hello"

这就是返回的Set具有ConcurrentHashMap.KeySetView类型的原因。此类型具有用于asking for the backing mapwhich value will be used when adding new keys的其他方法。

因此,虽然ConcurrentHashMap.newKeySet()看起来和Collections.newSetFromMap(new ConcurrentHashMap<>())做的是一样的,但语义上的区别是后者说你不应该在事后使用地图,而前者是设计用来与地图交互的功能的一部分。

请参阅Collections.newSetFromMap

调用此方法时,指定的映射必须为空,并且不应在此方法返回后直接访问。

事实上,甚至没有指定Collections.newSetFromMap将使用Boolean.TRUE来实现附加值-无论如何…都不应该处理这件事

当您想要将Set传递给显式请求ConcurrentHashMap.KeySetView的代码时,它也可能很有用。

如果您仅使用编译时类型Set来使用结果,则仍有可能接收Set的代码将使用instanceof/type强制转换来发现ConcurrentHashMap.newKeySet()的结果由ConcurrentHashMap支持,而Collections.newSetFromMap的结果不会告诉您。另一方面,这也允许代码以…的方式对后端映射做意想不到的事情

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32054517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档