据我了解,有几种方法(也许还有其他方法)可以在 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 thatCloneable
is broken, but it happens.
Bloch(顺便说一下,他设计并实现了 Collection 框架)甚至进一步说他只提供 clone()
方法只是“因为人们期望它”。他实际上根本不推荐使用它。
我认为更有趣的争论是复制构造函数是否比复制工厂更好,但这完全是一个不同的讨论。
关于java - Java中 map 的浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2356809/