0

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

originalDatesSerie = datesSerie ;

而不是使用:

originalDatesSerie.addAll(datesSerie) ;

在被调用方法中使用时,原始列表保持在调用方法addAll中,因此在这种情况下结果符合预期。

这是一段丑陋的代码,它是好的(但如果使用直接相等的分配则不行):

    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);
}
4

2 回答 2

1

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

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

于 2012-10-28T13:54:06.040 回答
0

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

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

于 2012-10-28T13:58:29.317 回答