来自List的原始数据在方法内部更改,即使复制原始List也是如此

时间:2012-10-28 13:35:03

标签: android pointers reference arraylist

为什么我在调用方法中更改了原始数据,即使在调用方法中使用以下内容复制原始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);
}

2 个答案:

答案 0 :(得分:1)

在您的第一个示例(originalDatesSerie = datesSerie ;)中,您要将dateSerie的引用分配给originalDatesSerie,这意味着两者都引用相同的ArrayList。当您通过一个引用或添加/删除对象对对象进行更改时,它将反映在两者中。

在第二个示例originalDatesSerie.addAll(datesSerie) ;中,originalDatesSerie引用dateSerie中的每个对象,但引用是一组单独的引用(ListArray)。将对象添加到originalDatesSerie时,您将它们添加到单独的集合中。

答案 1 :(得分:0)

  

为什么我在调用方法中更改了原始数据,即使在调用方法中使用以下内容复制原始List:

使用什么类型的复制无关紧要 - addAll()或'='。您的item元素是Dates,它们是可变对象。引用存在于两个不同列表中的可变对象可以从任一列表中变异。在函数之间传递不可变对象以隔离它们。