Java:如何获取ConcurrentHashMap的静态快照?

时间:2016-06-13 05:23:35

标签: java java.util.concurrent concurrenthashmap

Java doc表示方法值()和entrySet()的返回值由映射支持。因此,对地图的更改将反映在集合中,反之亦然。我不希望这发生在我的静态副本上。基本上,我希望在我的DS上完成大量并发操作。但在某些情况下,我想迭代其静态快照。我想迭代静态快照,因为我假设与正在同时更新的版本相比,迭代静态快照会更快。

2 个答案:

答案 0 :(得分:8)

只需复制一份,就不会改变。

Set<K> keySetCopy = new HashSet<>(map.keySet());
List<V> valuesCopy = new ArrayList<>(map.values());

所有集合实现都有一个复制构造函数,它将所提供集合的整个数据复制到新创建的集合中,而不受原始集合的支持。

注意:这不适用于entrySet(),因为实际的地图条目仍然“属于”原始地图,对原始条目的更改将反映在您的副本中。如果您需要entrySet(),则应首先使用相同的技术复制整个地图。

Set<Entry<K,V>> entrySetCopy = new HashMap<>(map).entrySet();

请注意,所有这些都需要完整的迭代ONCE(在构造函数中),然后才会成为静态快照。据我所知,没有办法解决这个限制。

答案 1 :(得分:1)

只需制作副本,新的HashMap将独立于原始HashMap。

Set<K> keySetCopy = new HashSet<>(map.keySet());
List<V> valuesCopy = new ArrayList<>(map.values());

但请注意,这将在concurrentStructure上进行一次完整的迭代,但只会是静态快照。所以你需要的时间相当于一次完整的迭代。