我们有一个简单的自定义对象:
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
。
与同类i
和numList
,虽然不是完全完全相同。numList
包含Integer
对象,从autoboxed 1
,3
,5
... for
将分配Integer对象的值i
。如果然后更改的值i
以(autoboxed) Integer(8)
,它也不会影响numList
任何。
然而,co
和objL
你做一个非常不同的事情。而不是重新分配的co
另一个对象(这不会影响中的对象objL
),您选择来调用方法co
,然后发生了改变自己的状态。请注意,在这里你是不是修改objL
,你修改它包含的对象。
关键的观点是i
,co
并s
没有相应的数组中的元素。它们包含的值是可能是数组中的元素(但再次autounboxing的情况下,这也太不成立)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句