私たちは、単純なカスタムオブジェクトを持っています:
public class CustomObject {
public CustomObject(int myIntNumber, String myString) {
this.myIntNumber = myIntNumber ;
this.myString = myString;
}
private int myIntNumber;
private String myString;
public void setMyIntNumber(int myIntNumber) {
this.myIntNumber = myIntNumber;
}
public int getMyIntNumber() {
return myIntNumber;
}
public void setMyString(String myString) {
this.myString = myString;
}
public String getMyString() {
return myString;
}
public String toString() {
return "CustomObject [" + String.valueOf(myIntNumber) + ", "+ myString+"]" ;
}
}
そして、我々はのために...各ループにそのようなオブジェクトのArrayListのを修正しようとします。文字列のArrayListのオブジェクトまたはIntegerオブジェクトのがこの方法で変更できない場合はなぜ、リスト内のオブジェクトは、変更されますか?
私のテストコード:
import java.util.ArrayList;
public class TestTraveringListModification {
public static void main(String[] args) {
ArrayList<String> sList = new ArrayList<String>();
sList.add("String a");
sList.add("String b");
sList.add("C");
sList.add("D");
sList.add("String f");
sList.add("String e");
System.out.println("Before: "+sList);
for (String s : sList) {
s="asdf" ;
}
System.out.println("After: "+ sList);
ArrayList<CustomObject> objL = new ArrayList<CustomObject> () ;
objL.add(new CustomObject (1, "test") );
objL.add(new CustomObject (2, "jim") );
objL.add(new CustomObject (20, "dec") );
objL.add(new CustomObject (60, "what") );
System.out.println("before: "+ objL );
for(CustomObject co : objL ){
co.setMyIntNumber(-1);
co.setMyString("modified String");
}
System.out.println("after: "+objL);
ArrayList<Integer> numList = new ArrayList<Integer>();
numList.add(1);
numList.add(3);
numList.add(5);
numList.add(67);
numList.add(9598);
System.out.println("before: "+ numList);
for (Integer i : numList){
i = 8;
}
System.out.println("after: "+ numList);
}
}
これを実行すると、次の出力が生成されます。
Before: [String a, String b, C, D, String f, String e]
After: [String a, String b, C, D, String f, String e]
before: [CustomObject [1, test], CustomObject [2, jim], CustomObject [20, dec], CustomObject [60, what]]
after: [CustomObject [-1, modified String], CustomObject [-1, modified String], CustomObject [-1, modified String], CustomObject [-1, modified String]]
before: [1, 3, 5, 67, 9598]
リスト項目
after: [1, 3, 5, 67, 9598]
だから、なぜそれは私がSLISTまたはnumList objLを変更しないということですか?
再割り当ておよび変異は、二つの異なるものですので。
s = "asdf"
内容を変更しますs
に参照のうえれます。それはのメンバーへの参照を含むために使用されsList
、今、それが参照します、"asdf"
。変更はのメンバーとは何の関係もありませんsList
。
同様にi
してnumList
、ではないが、完全に正確に同じ。numList
含まれているInteger
からautoboxedオブジェクト、1
、3
、5
... for
整数に値をオブジェクトに割り当てますi
。あなたは、その後の値を変更した場合i
には(autoboxed) Integer(8)
、それも影響しませんnumList
いずれかを。
しかし、でco
とobjL
、あなたは非常に異なることを行います。代わりに、再割り当てのco
(内のオブジェクトに影響を与えない別のオブジェクトにobjL
)、あなたは上のメソッドを呼び出すことを選択したco
後、その状態を変更するために起こりました、。注ここにあなたがしていることではない変更するobjL
、あなたはそれが含まれているオブジェクトを変更しています。
キー洞察はつまりi
、co
およびs
それぞれのリストの要素ではありません。彼らは値が含まれているかもしれないリストの要素であることを(しかし、再びautounboxingの場合には、これはあまりにも保持していません)。