黑马程序员技术交流社区
标题:
list容器习题疑问
[打印本页]
作者:
小黑马
时间:
2012-9-13 13:00
标题:
list容器习题疑问
本帖最后由 马小龙 于 2012-9-13 21:26 编辑
package com.itheima;
import java.util.ArrayList;
class Data {
int val;
int getVal() {
return val;
}
void setVal(int val) {
this.val = val;
}
}
public 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);//分别往ArrayList装入3个Data对象,这三个Data对象的val分别是100,101,102
list.add(data);
}
int j = 0;
while (j < list.size()) {//
Data tmp = (Data )list.get(j); //循环获得这三个数据,并强转成Data对象
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
/*
这个问题好奇怪,自己按照思路得出的答案是
list(0)=100 list(1)=101 list(2)=102
为什么编译运行后是
list(2)=102 list(2)=102 list(2)=102
*/
请大神详细解答一下
作者:
黑马张旭明
时间:
2012-9-13 13:21
public class ListTest {
public static void main(String argv[]) {
Data data = new Data();
//只new了一个对象
ArrayList list = new ArrayList();
for (int i=100; i<103; i++) {
data.setVal(i);//分别往ArrayList装入3个Data对象,这三个Data对象的val分别是100,101,102
list.add(data);
}
int j = 0;
while (j < list.size()) {//
Data tmp = (Data )list.get(j); //循环获得这三个数据,并强转成Data对象
System.out.println("list(" + j + ") = " + tmp.getVal());
j++;
}
}
}
问题出在Data data = new Data(); 和data.setVal(i);这两句。
首先,list里保存的是引用,即指向data这个对象的引用。
第一次data.setVal(i);
data对象中的Val值变成100.
listadd(data);
将指向data的引用存入list集合中。
第二次data.setVal(i);
data对象中的Val值变成101.
listadd(data);
将指向data的引用存入list集合中。
第三次data.setVal(i);
data对象中的Val值变成102.
listadd(data);
将指向data的引用存入list集合中。
这时list集合中就有了三个引用,都指向data,而随着每次data.setVal(i); data中的Val值就改变一次,最后是102,
这三个引用都是一样的,都指向了内存中同一个对象data,而 data中的数值最后是102,所以三个getVal();取
出的都是102.
作者:
李菁
时间:
2012-9-13 13:41
Data data = new Data();只new了一个对象,那就在堆内存中分配了一个名为data的空间,
每次调用setVal的方法改变一次data的值,但是只有一个引用,所以最后data的值是102
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2