Java8引入了一种获得并发Set实现的新方法
// 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();有什么理由选择新的方法吗?
有什么优点/缺点吗?
发布于 2015-08-18 00:01:11
ConcurrentHashMap.newKeySet()应该更有效率,因为它删除了单个级别的间接性。Collections.newSetFromMap(map)主要基于将操作重定向到map.keySet(),但ConcurrentHashMap.newKeySet()非常接近map.keySet()本身(只是增加了支持)。
至于功能,我看不出有什么不同。
发布于 2015-08-18 00:01:19
ConcurrentHashMap.newKeySet()只是一个比Collections.newSetFromMap(new ConcurrentHashMap<>())更广泛的特性的一部分。
如果你看这个例子,区别就会变得很明显:
Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");现在不是映射到Boolean.TRUE,而是在向Set添加新值时添加值"hello"。
这就是返回的Set具有ConcurrentHashMap.KeySetView类型的原因。此类型具有用于asking for the backing map和which 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的结果不会告诉您。另一方面,这也允许代码以…的方式对后端映射做意想不到的事情
https://stackoverflow.com/questions/32054517
复制相似问题