从头到尾操作的都是同一个对象?这句话怎么理解?
import java.util.*;
class Data {
int val;
int getVal() {
return val;
}
void setVal(int val) {
this.val = val;
}
public String toString()
{
return getVal()+"";
}
}
class ListTest {
public static void main(String args[]) {
Data data = new Data();
ArrayList<Data> list = new ArrayList<Data>();
for (int i=100; i<103; i++) {
data.setVal(i);//100 101 102
System.out.println(data);
System.out.println(list+"++++");
list.add(data);
System.out.println(list);
}
int j = 0;
while (j < list.size()) {
Data tmp = (Data )list.get(j);
System.out.println(tmp+"--");
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
class ListTest {
public static void main(String argv[]) {
Data data = new Data();
ArrayList list = new ArrayList();
for (int i=100; i<103; i++) {
data.setVal(i); //第一次循环存入的是100,第二循环存入的101,但同时上次那个100又加了1,因为i++,所以取出来的三个数都是102
list.add(data);
System.out.println(list);
}
int j = 0;
while (j < list.size()) {
Data tmp = (Data )list.get(j);
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
作者: 肖琦 时间: 2012-7-25 00:05
问题是你对内部的实现不是很了解。
Data date = new Date();//此处你创建了一个date对象,其实真正的理解是date是门牌号,new Date()是在内存中开劈的一块空间。此date门牌号指向了开劈的空间。
data.setVal(i);//此处你通过方法给它的属性赋值,改变的是空间中存储的数据
list.add(data);//list添加了data对象,其实就是list集合的最后一个元素指向date的储存空间。
以上两段代码你是放在循环中的,因此,循环最后一次执行的值才是date的存储空间的值,而list集合的每一个元素都指向date的空间,因此你遍历list集合,结果每一个值是相同。