Java中的Map的浅表副本

据我了解,有几种方法(可能也有其他方法)MapJava中创建a的浅表副本:

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();

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

值得一提的是,第二种方式会发出“未经检查的演员表”警告。因此,您必须添加内容@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();

}

回答:

使用复制构造函数进行复制总是更好。clone()Java中的损坏(请参见SO:如何正确覆盖克隆方法?)。

Josh Bloch谈设计-复制构造函数与克隆

如果您已经阅读了我书中有关克隆的文章,尤其是您在两行之间阅读的话,您会知道我认为它clone已被深深地打断。[…]这是一种耻辱Cloneable,但确实发生了。

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


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

以上是 Java中的Map的浅表副本 的全部内容, 来源链接: utcz.com/qa/402165.html

回到顶部