为什么我在调用方法中更改了原始数据,即使在调用方法中使用以下内容复制原始List:
originalDatesSerie = datesSerie ;
而不是使用:
originalDatesSerie.addAll(datesSerie) ;
在调用方法中使用addAll
时,原始List在调用方法中保留,因此在这种情况下结果与预期一致。
这是一段丑陋的代码,是好的(如果使用直接相等的分配,则为NOK):
private static HashMap<String, Object> autoScaling(List<Date[]> datesSerie, List<double[]> valuesSerie,
HashMap<String, Long> xminMax) {
// Copy original List (required to keep them unchanged)
List<Date[]> originalDatesSerie = new ArrayList<Date[]> ();
originalDatesSerie.addAll(datesSerie);//do NOT use "="
List<double[]> originalValuesSerie = new ArrayList<double[]> ();
originalValuesSerie.addAll(valuesSerie);//do NOT use "="
...
// Concat new datas with original datas
originalDatesSerie.addAll(Xaxis);
originalValuesSerie.addAll(Yaxis);
}
答案 0 :(得分:1)
在您的第一个示例(originalDatesSerie = datesSerie ;
)中,您要将dateSerie
的引用分配给originalDatesSerie
,这意味着两者都引用相同的ArrayList
。当您通过一个引用或添加/删除对象对对象进行更改时,它将反映在两者中。
在第二个示例originalDatesSerie.addAll(datesSerie) ;
中,originalDatesSerie
引用dateSerie
中的每个对象,但引用是一组单独的引用(ListArray
)。将对象添加到originalDatesSerie
时,您将它们添加到单独的集合中。
答案 1 :(得分:0)
为什么我在调用方法中更改了原始数据,即使在调用方法中使用以下内容复制原始List:
使用什么类型的复制无关紧要 - addAll()或'='。您的item元素是Dates,它们是可变对象。引用存在于两个不同列表中的可变对象可以从任一列表中变异。在函数之间传递不可变对象以隔离它们。