为什么可以修改自定义的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整数的对象或对象不能用这种方式修改?

我的测试代码:

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]

那么,为什么是它,我可以修改objL而不是SLIST或numList?

傻瓜:

由于重新分配和变异是两回事。

s = "asdf"会有什么变化s是指的。它用于包含对的成员的引用sList,现在它是指"asdf"这一变化无关的成员sList

与同类inumList,虽然不是完全完全相同。numList包含Integer对象,从autoboxed 135... for将分配Integer对象的值i如果然后更改的值i以(autoboxed) Integer(8)它也不会影响numList任何。

然而,coobjL你做一个非常不同的事情。而不是重新分配的co另一个对象(这不会影响中的对象objL),您选择来调用方法co,然后发生了改变自己的状态。请注意,在这里你是不是修改objL,你修改它包含的对象。

关键的观点是icos没有相应的数组中的元素。它们包含的值可能是数组中的元素(但再次autounboxing的情况下,这也太不成立)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章