当前位置: 首页 > 面试题库 >

Java中的Map的浅表副本

王伯寅
2023-03-14
问题内容

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

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



 类似资料:
  • 本文向大家介绍浅析java中遍历map的两种方式,包括了浅析java中遍历map的两种方式的使用技巧和注意事项,需要的朋友参考一下 话不多说,直奔主题,跟着小编一起往下看: 1.先将map对象转成set,然后再转为迭代器 2.先将map转为set类型的key值集合,然后转为迭代器 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,同时也希望多多

  • 本文向大家介绍如何在C#中创建Hashtable的浅表副本?,包括了如何在C#中创建Hashtable的浅表副本?的使用技巧和注意事项,需要的朋友参考一下 要创建Hashtable的浅表副本,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 我在Java工作,我必须评估作为字符串给出的数学表达式。例如: 将导致 我尝试了“Java评估图书馆”,但没有找到帮助。请告诉我怎样解决这种问题。我可以使用数据结构堆栈或队列来计算这样表达式,但我必须考虑运算符的优先级,因为乘法是在减法、加法之前完成的。什么数据结构最适合这种情况,记住时间复杂性。

  • 问题内容: 我需要Java的浅表副本,是否应该使用或遍历原始列表并将元素复制到新的arrayList中,这会更快? 问题答案: 使用或使用复制构造函数。 复制构造函数从传递的集合到数组进行其他转换,而该方法直接使用内部数组。 请记住,回报,所以您将不得不放弃。

  • 本文向大家介绍浅析scala中map与flatMap的区别,包括了浅析scala中map与flatMap的区别的使用技巧和注意事项,需要的朋友参考一下 在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的。没有可变的状态,函数就是

  • 本文向大家介绍浅谈c++中的stl中的map用法详解,包括了浅谈c++中的stl中的map用法详解的使用技巧和注意事项,需要的朋友参考一下 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map