Java: 如何对ConcurrentHashMap进行静态快照?

Java: How to take static snapshot of ConcurrentHashMap?

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

复制一份即可,不会更改

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

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

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

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

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

简单的复制一份,新的HashMap会独立于原来的HashMap。

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

但是请注意,这将对 concurrentStructure 进行一次完整的迭代,一次但只会是静态快照。因此,您将需要相当于一次完整迭代的时间。