我需要制作一个副本,`HashMap<Integer, List
但是当我更改副本中的某些内容时,我希望原件保持原样。也就是说,当我
List从副本中删除某项内容时,它会保留在
List`原件中。
如果我正确理解,这两种方法只会创建浅拷贝,这不是我想要的:
mapCopy = new HashMap<>(originalMap);
mapCopy = (HashMap) originalMap.clone();
我对吗?
除了遍历所有键和所有列表项并手动复制之外,还有更好的方法吗?
没错,浅表副本不能满足您的要求。它将具有List
原始地图中的副本,但这些副本List
将引用相同的List
对象,因此对List
from
的修改HashMap
将出现在List
from的对应内容中HashMap
。
HashMap
在Java中,没有提供深拷贝功能,因此您仍然必须遍历所有条目,put
并在new
条目中进行遍历HashMap
。但是您也应该List
每次都复制一份。像这样:
public static HashMap<Integer, List<MySpecialClass>> copy(
HashMap<Integer, List<MySpecialClass>> original)
{
HashMap<Integer, List<MySpecialClass>> copy = new HashMap<Integer, List<MySpecialClass>>();
for (Map.Entry<Integer, List<MySpecialClass>> entry : original.entrySet())
{
copy.put(entry.getKey(),
// Or whatever List implementation you'd like here.
new ArrayList<MySpecialClass>(entry.getValue()));
}
return copy;
}
如果要修改单个MySpecialClass
对象,并且所做的更改未反映在所List
复制的对象中HashMap
,那么您也需要为其创建新副本。
有人告诉我构造函数复制是一种浅层复制方法。 通常情况下,如果我修改了List ints的第一个元素,那么List intscope中的相应元素应该已经修改为31了,对吗?因为变量intscope和ints引用了同一个对象,但我得到了这个输出。 举个例子,我的意思是: 我得到这样的输出: 因为变量arr和arr2引用了同一个对象。如果我修改了数组中的一个元素,那么其他元素也会产生影响。当我使用列表进
本文向大家介绍如何在JavaScript中浅复制对象?,包括了如何在JavaScript中浅复制对象?的使用技巧和注意事项,需要的朋友参考一下 Underscore.js,JavaScript的一个库,推出了一种称为 _.extend() ,以浅拷贝中的JavaScript对象。此方法将源 对象中的所有属性复制到目标 对象,然后返回目标对象。在此引用 用于复制,但不用于复制。 语法 它接受对象并
只是想通过查看代码来了解的工作原理。添加元素时,会发生以下情况: 密钥的hashcode已获取 哈希函数应用于结果 方法indexFor应用于2的结果。这给出了相应桶中的第一个条目。然后循环遍历桶中的链表-找到结尾并添加元素。 indexOf的实施是: 我不明白indexOf方法中的诀窍。有人能解释一下吗? 谢谢
问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项
问题内容: 如何在Java中复制对象? 问题答案: 创建一个副本构造函数: 每个对象还有一个克隆方法,可用于复制对象,但不要使用它。创建类和执行不正确的克隆方法太容易了。
本文向大家介绍浅谈Javascript中深复制,包括了浅谈Javascript中深复制的使用技巧和注意事项,需要的朋友参考一下 在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象。举例子来说明可能会比较好: 所以其实我们深复制主要需要处理的对象就是object对象,非object对象只要直接正常的赋值就好。我实现js深复制的思路就是: 遍历