なぜカスタムのArrayListのがために...各ループ内のオブジェクト変更することが可能です

Kinnison84:

私たちは、単純なカスタムオブジェクトを持っています:

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オブジェクト、135... for整数に値をオブジェクトに割り当てますiあなたは、その後の値を変更した場合iには(autoboxed) Integer(8)それも影響しませんnumListいずれかを。

しかし、でcoobjL、あなたは非常に異なることを行います。代わりに、再割り当てのco(内のオブジェクトに影響を与えない別のオブジェクトにobjL)、あなたは上のメソッドを呼び出すことを選択したco後、その状態を変更するために起こりました、。注ここにあなたがしていることではない変更するobjL、あなたはそれが含まれているオブジェクトを変更しています。

キー洞察はつまりicoおよびsそれぞれのリストの要素ではありません。彼らは値が含まれているかもしれないリストの要素であることを(しかし、再びautounboxingの場合には、これはあまりにも保持していません)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223068&siteId=1