我通常这样做是为了将新的 Map 设置为私有(private)变量:
public static void setListaClausulas(Map<String, Clausula> nvLista) {
listaClausulas = new TreeMap<String, Clausula>(nvLista);
}
我认为设置 nvLista
及其所有成员的新副本(而不是引用)是可以的,是吗?
但现在我在另一个 map 中有一个 map ,我正在这样做:
public static void setListaClausulas(Map<String, Map<String, Clausula>> nvLista) {
listaClausulas = new TreeMap<String, Map<String, Clausula>>(nvLista);
}
这是正确的方法还是您推荐其他方法?我想要的是设置 nvLista
(及其所有元素)的新副本,而不是仅复制引用。
最佳答案
我猜您担心在方法参数中传递的映射会发生变化?
您需要创建参数的深拷贝。这个问题中讨论了各种方法,deep-clone-utility-recomendation
编辑:为了回应评论,这里有一个编码版本。这不会深度复制 Clausula
实例,因为它们之前没有被复制 - 我假设它们是不可变的。
public Map<String, Map<String, Clausula>> deepCopy(Map<String, Map<String, Clausula>> nvLista)
{
Map<String, Map<String, Clausula>> target = new TreeMap<String, Map<String, Clausula>>();
for (String key: nvLista.keySet()) {
Map<String, Clausula> value = nvLista.get(key);
target.put(key, new TreeMap<String,Clausula>(value));
}
return target;
}
但是,像这样的嵌套集合类型很快就会变得不可读。如果您可以更改代码,则可能有助于为最里面的映射创建包装器对象的可读性。
关于java - 如何编写一个Map的set方法并将另一个Map作为值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2924486/