Java中的Map的浅表副本

2020/11/30 22:11 · java ·  · 0评论

据我了解,有几种方法(可能也有其他方法)Map在Java中创建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()“因为人们期望它”的方法。他实际上根本不建议使用它。


我认为更有趣的辩论是复制构造函数是否比复制工厂更好,但这完全是另一回事。

无论是两个:在构造函数中,你指的是对被定义的HashMap实施的地图,(以及其他人),但不是Map接口本身(例如,考虑提供Map接口的实现:你不会找到该构造函数)。

另一方面,不建议使用该clone()方法,如Josh Bloch所述。

关于Map接口(以及您的问题,其中您询问如何复制Map,而不是HashMap),应该使用Map#putAll()

将所有映射从指定映射复制到此映射(可选操作)。对于从指定映射中的键k到值v的每个映射,此调用的效果等效于在此映射上调用一次put(k,v)的效果。

例:

// HashMap here, but it works for every implementation of the Map interface
Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy = new HashMap<String, Object>();

shallowCopy.putAll(data);

在不知道其实现的情况下复制地图:

static final Map shallowCopy(final Map source) throws Exception {
    final Map newMap = source.getClass().newInstance();
    newMap.putAll(source);
    return newMap;
}
本文地址:http://java.askforanswer.com/javazhongdemapdeqianbiaofuben.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!