作者:俏君woo_267 | 来源:互联网 | 2023-05-23 18:48
我需要复制一份,HashMap >
但是当我在副本中更改某些内容时,我希望原件保持不变.即,当我List
从副本中删除某些内容时,它会保留在List
原始内容中.
如果我理解正确,这两个方法只会创建浅层副本,这不是我想要的:
mapCopy = new HashMap<>(originalMap);
mapCopy = (HashMap) originalMap.clone();
我对吗?
有没有比这更好的方法来迭代所有键和所有列表项并手动复制它?
1> sprinter..:
遗憾的是,这确实需要迭代.但是Java 8流程非常简单:
mapCopy = map.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> new ArrayList(e.getValue()));
编辑:在Java的更高版本中,e -> List.copyOf(e.getValue())
将是首选.
getValue()不会只是传递引用吗?
2> rgettman..:
你是对的,浅拷贝不符合你的要求.这将有副本List
期从原来的地图,但这些List
旨意指的是同一个List
对象,以便于修改List
从一个HashMap
将出现在相应的List
从另一个HashMap
.
HashMap
在Java中没有为Java 提供深度复制,因此您仍然需要遍历所有条目以及put
新的条目HashMap
.但是你也应该List
每次复制一份.像这样的东西:
public static HashMap> copy(
HashMap> original)
{
HashMap> copy = new HashMap>();
for (Map.Entry> entry : original.entrySet())
{
copy.put(entry.getKey(),
// Or whatever List implementation you'd like here.
new ArrayList(entry.getValue()));
}
return copy;
}
如果要修改单个MySpecialClass
对象,并且更改未反映在List
复制的s中HashMap
,则还需要制作它们的新副本.
3> neu242..:
序列化为json,然后反序列化:
Map originalMap = new HashMap<>();
String json = new Gson().toJson(originalMap);
Map mapCopy = new Gson().fromJson(
json, new TypeToken
对于特殊的类,您可能需要编写一个自定义反序列化器。
我猜这是关于这项技术的性能损失的投票,但是IMO尽管有性能损失,但这是一个合法的答案。