首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克隆ConcurrentHashMap

克隆ConcurrentHashMap
EN

Stack Overflow用户
提问于 2016-07-17 04:10:08
回答 2查看 8.4K关注 0票数 3

为什么我不能克隆ConcurrentHashMap

代码语言:javascript
复制
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,它就能工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-17 04:20:06

clone()方法在AbstractMap上不是用来复制的,它是一个内部方法,注意受保护的关键字。

代码语言:javascript
复制
protected Object clone() throws CloneNotSupportedException {

HashMap碰巧有一个公共clone(),,但这并不意味着您应该使用它,这是Effective Java: Analysis of the clone() method进一步讨论的。

创建集合副本的一种更灵活的方法是通过复制构造函数。这些方法的优点是可以从任何其他地方创建任何Map实现。

代码语言:javascript
复制
/**
 * Creates a new map with the same mappings as the given map.
 *
 * @param m the map
 */
public ConcurrentHashMap(Map<? extends K, ? extends V> m) {

例如:

代码语言:javascript
复制
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"));
票数 15
EN

Stack Overflow用户

发布于 2019-01-11 17:08:18

更优雅的方法是执行深度克隆。如果确实执行深度克隆,那么可能存在这样一个场景:您只复制存储在并发hashmap中的引用,而不是实际的对象。这就是为什么在这种情况下,深度克隆是对象图中的对象被克隆的首选。进行深度克隆的最简单方法之一是使用apache库- SerializationUtils#clone。

代码语言:javascript
复制
<dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

您可以使用SerializationUtils类的克隆api执行深度克隆,如下所示-

代码语言:javascript
复制
ConcurrentHashMap<String, Vertex> transposeVertexMap = (ConcurrentHashMap<String, Vertex>) SerializationUtils.clone(vertexMap);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38417830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档