我通常这样做是为了将新Map设置为私有变量:
public static void setListaClausulas(Map<String, Clausula> nvLista) {
listaClausulas = new TreeMap<String, Clausula>(nvLista);
}
我认为可以设置nvLista
及其所有成员的新副本而不是参考,是吗?
但是现在我在另一张地图中有一张地图而我正在这样做:
public static void setListaClausulas(Map<String, Map<String, Clausula>> nvLista) {
listaClausulas = new TreeMap<String, Map<String, Clausula>>(nvLista);
}
这是正确的方法,还是你推荐别的东西?我想要的是设置nvLista
(及其所有元素)的新副本,而不是只复制引用。
答案 0 :(得分:1)
我猜你担心你的方法参数中传递的地图会发生变异吗?
您需要创建参数的深层副本。在这个SO问题中讨论了各种方法,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;
}
但是,像这样的嵌套集合类型很快变得不可读。如果您可以更改代码,则可能有助于为最内层映射创建包装器对象。
答案 1 :(得分:0)
对于一般情况,深度复制很难,但您可以这样做来解决您的特定问题:
static Map< String, Map< String, Clausula > > deepCopy (
final Map< String, Map< String, Clausula > > source
)
{
final TreeMap< String, Map< String, Clausula> > result =
new TreeMap< String, Map<String,Clausula> >( );
for (
final Map.Entry< String, Map< String, Clausula> > cur :
source.entrySet( )
)
{
result.put(
cur.getKey( ),
new TreeMap< String, Clausula >( cur.getValue( ) )
);
}
return result;
}