0

呼び出されたメソッドで以下を使用して元のリストをコピーした場合でも、呼び出し元のメソッドで元のデータが変更されるのはなぜですか。

originalDatesSerie = datesSerie ;

を使用する代わりに:

originalDatesSerie.addAll(datesSerie) ;

呼び出されたメソッドで使用する場合、元のリストは呼び出し元のメソッドにそのまま保持されるaddAllため、その場合の結果は期待どおりです。

これがOkである醜いコードの一部です(ただし、直接等しい割り当てを使用している場合は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);
}
4

2 に答える 2

1

最初の例 ( ) では、へoriginalDatesSerie = datesSerie ;の参照を割り当てています。つまり、両方が同じ を参照しています。1 つの参照またはオブジェクトの追加/削除によってオブジェクトに変更を加えると、両方に反映されます。dateSerieoriginalDatesSerieArrayList

2 番目の例originalDatesSerie.addAll(datesSerie) ;originalDatesSerieは、 は 内の各オブジェクトをdateSerie参照しますが、参照は個別の参照セットです ( ListArray)。にオブジェクトをoriginalDatesSerie追加すると、別のコレクションに追加されます。

于 2012-10-28T13:54:06.040 に答える
0

呼び出されたメソッドで次を使用して元の List をコピーした場合でも、呼び出し元のメソッドで変更された元のデータを取得するのはなぜですか。

addAll() または '=' のどちらの種類のコピーを使用するかは問題ではありません。item 要素は、変更可能なオブジェクトである Date です。参照が 2 つの異なるリストに存在する可変オブジェクトは、どちらのリストからも変更できます。関数間で不変オブジェクトを渡して、それらを分離します。

于 2012-10-28T13:58:29.317 に答える