お気軽に:
私は日食で、次のコードを実行します。
ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
ArrayList<Integer> alist = new ArrayList<Integer>();
// add some elements ti list
list.add(new StringBuilder("hello"));
list.add(new StringBuilder("2"));
list.add(new StringBuilder("hi"));
list.add(new StringBuilder("this"));
// add some elements to alist
alist.add(4);
alist.add(9);
//get method
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;
// print the list
System.out.println("LinkedList:" + list);
System.out.println("ArrayList:" + alist);
その結果はこちら
LinkedList:[hello, 2, hi, this is a good day]
ArrayList:[4, 9]
これは、getメソッドは、A(のStringBuilderの場合)リスト要素の浅いコピーを返すように見えますが、Bに(整数の場合)ディープコピーを返します!なぜそれが起こったのか?getメソッドは、リストの要素の深いか浅いコピーを返すのですか?
彼らは次のとおりでした:
get
リターンを参照するList
要素ではなく、コピー(深いも浅いもありません)。
最初のスニペットでは、変数が参照するオブジェクトを変異さa
せ、List
また影響されます。
StringBuilder a = list.get(3);
a.append(" is a good day");
第二のスニペットでは、変数に新しい値を割り当てるb
には影響しません、List
。
int b = alist.get(1);
b = 7;
第二として動作するようにあなたの最初のスニペットためには、次のように記述する必要があります。
StringBuilder a = list.get(3);
a = new StringBuilder(" is a good day");
およびList
影響を受けることはありません。
他の方法では、最初のような第2のスニペットの振る舞いをすることはできません。あなたが割り当てられている場合でもList
に要素をInteger
変数以来、あなたは、それを変異する任意のメソッドを呼び出すことはできませんInteger
不変です。