为什么我不能克隆ConcurrentHashMap
ConcurrentHashMap<String, String> test = new ConcurrentHashMap<String, String>();
test.put("hello", "Salaam");
ConcurrentHashMap<String, String> test2 = (ConcurrentHashMap<String, String> ) test.clone();
System.out.println(test2.get("hello"));如果我使用HashMap而不是ConcurrentHashMap,它就能工作。
发布于 2016-07-17 04:20:06
clone()方法在AbstractMap上不是用来复制的,它是一个内部方法,注意受保护的关键字。
protected Object clone() throws CloneNotSupportedException {HashMap碰巧有一个公共clone(),,但这并不意味着您应该使用它,这是Effective Java: Analysis of the clone() method进一步讨论的。
创建集合副本的一种更灵活的方法是通过复制构造函数。这些方法的优点是可以从任何其他地方创建任何Map实现。
/**
* Creates a new map with the same mappings as the given map.
*
* @param m the map
*/
public ConcurrentHashMap(Map<? extends K, ? extends V> m) {例如:
ConcurrentHashMap<String, String> original = new ConcurrentHashMap<String, String>();
original.put("hello", "Salaam");
Map<String, String> copy = new ConcurrentHashMap<>(original);
original.remove("hello");
System.out.println(copy.get("hello"));发布于 2019-01-11 17:08:18
更优雅的方法是执行深度克隆。如果确实执行深度克隆,那么可能存在这样一个场景:您只复制存储在并发hashmap中的引用,而不是实际的对象。这就是为什么在这种情况下,深度克隆是对象图中的对象被克隆的首选。进行深度克隆的最简单方法之一是使用apache库- SerializationUtils#clone。
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>您可以使用SerializationUtils类的克隆api执行深度克隆,如下所示-
ConcurrentHashMap<String, Vertex> transposeVertexMap = (ConcurrentHashMap<String, Vertex>) SerializationUtils.clone(vertexMap);https://stackoverflow.com/questions/38417830
复制相似问题