【问题标题】:ConcurrentHashMap.newKeySet() vs Collections.newSetFromMap()ConcurrentHashMap.newKeySet() 与 Collections.newSetFromMap()
【发布时间】:2015-08-17 15:46:09
【问题描述】:

Java 8 引入了获取并发 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();

有什么理由更喜欢新方法吗?

有什么优点/缺点?

【问题讨论】:

  • 它更短...

标签: java set java-8 java.util.concurrent concurrenthashmap


【解决方案1】:

ConcurrentHashMap.newKeySet() 只是比Collections.newSetFromMap(new ConcurrentHashMap&lt;&gt;()) 更广泛的功能的一部分。

看一下这个例子,区别就很明显了:

Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");

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

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


所以虽然ConcurrentHashMap.newKeySet() 看起来和Collections.newSetFromMap(new ConcurrentHashMap&lt;&gt;()) 做同样的事情,但语义上的区别是后者说你以后不应该使用地图,而前者是旨在与地图。

Collections.newSetFromMap:

调用该方法时指定的map必须为空,且该方法返回后不能直接访问。

事实上,甚至没有指定Collections.newSetFromMap 将使用Boolean.TRUE 来获得附加值——无论如何你都不应该处理它……


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


如果您只使用编译时类型Set 的结果,那么接收Set 的代码仍有可能使用instanceof/type 强制转换来找出@987654343 的结果@ 由 ConcurrentHashMap 支持,而 Collections.newSetFromMap 的结果不会告诉你。另一方面,这也允许代码以这种方式使用 backing map 做意想不到的事情……

【讨论】:

  • 虽然这是真的,但我看不出这个功能对ConcurrentHashMap.newKeySet() 有什么用处...
  • @Tagir Valeev:我添加了一个注释,应该清楚。
【解决方案2】:

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

至于功能,我认为没有区别。

【讨论】:

  • “仅支持修改” 表示能够添加?因为键集总是有删除支持。
  • as removes a single level of indirection - 你确定吗?正如我所见,KeySetView 仍然将其方法委托给内部映射。
  • @turbanoff, KeySetView 将其方法委托给地图,但newSetFromMap 首先将其方法委托给 keySet 方法,然后再将它们委托给地图。这就是为什么它减少了一个间接级别。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2015-12-10
  • 2010-09-07
相关资源
最近更新 更多