繁体   English   中英

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

[英]Java: How to take static snapshot of ConcurrentHashMap?

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM