java - Java中 map 的浅拷贝

标签 java map clone shallow-copy

据我了解,有几种方法(也许还有其他方法)可以在 Java 中创建 Map 的浅拷贝:

Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;

// first way
shallowCopy = new HashMap<String, Object>(data);

// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();

一种方式优于另一种方式,如果是,为什么?

值得一提的是,第二种方式会给出“Unchecked Cast”警告。所以你必须添加 @SuppressWarnings("unchecked") 来绕过它,这有点烦人(见下文)。

@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
    // return a shallow copy of the data map
    return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}

最佳答案

使用复制构造函数进行复制总是更好。 Java 中的 clone() 已损坏(参见 SO:How to properly override clone method?)。

Josh Bloch on Design - Copy Constructor versus Cloning

If you've read the item about cloning in my book, especially if you read between the lines, you will know that I think clone is deeply broken. [...] It's a shame that Cloneable is broken, but it happens.

Bloch(顺便说一下,他设计并实现了 Collection 框架)甚至进一步说他只提供 clone() 方法只是“因为人们期望它”。他实际上根本不推荐使用它。


我认为更有趣的争论是复制构造函数是否比复制工厂更好,但这完全是一个不同的讨论。

关于java - Java中 map 的浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2356809/

相关文章:

java - 如何命名 JAXB 类?

java - 如何拆分流以不同方式处理元素?

java - 找到组合,给定 n 个盒子和 x 个球

测试具有相同内容的 Go 中 map 的等价性,但测试失败

Powershell - 如何使用 $List.convertAll() 或替代 C# 方法来克隆列表

Java:转换数据类型

java - MessageBodyProviderNotFoundException : MessageBodyReader not found for media type=text/html;charset=UTF-8

java - 为什么我的 map 坏了?

javascript - 使用私有(private)成员复制 javascript 对象

java - 在 java 中克隆和编辑 int[][] - 无法更改 int[][]