黑马程序员技术交流社区

标题: 关于for循环中的ArrayList问题,求大神解答 [打印本页]

作者: 478883662    时间: 2015-11-8 00:24
标题: 关于for循环中的ArrayList问题,求大神解答
class Data {
    int val;
}

public class Test3 {
          public static void main(String args[]) {
                   Data data = new Data();
                   ArrayList<Data> list = new ArrayList<Data>();

           for (int i = 100; i < 103; i++) {
                   data.val = i;
                   list.add(data);
           }

            for (Data d : list) {
                  System.out.println(d.val);
           }
     }
}
运行结果都是3个102,为什么啊 不懂
作者: 余旋    时间: 2015-11-8 00:35
你这段代码里面只有一个Data对象,for循环到最后一次把data的val赋值为102,其实集合中存放了3个重复的Data对象
作者: 西伯利亚的雪景    时间: 2015-11-8 09:11
楼上的头像有味道。~
作者: 478883662    时间: 2015-11-8 09:43
余旋 发表于 2015-11-8 00:35
你这段代码里面只有一个Data对象,for循环到最后一次把data的val赋值为102,其实集合中存放了3个重复的Data ...

是不是List  add的是对对象的引用,然后这3次循环改变了所引用的对象里的值,所以最终打印的3个val都是最后一个102.
作者: 黑夜中那颗星    时间: 2015-11-8 10:38
集合里面存入的是对象的引用地址,上面的代码循环三次存入的都是同一个对象的引用地址,说val的值是最后一次循环改变的值
作者: 许佳鑫    时间: 2015-11-8 13:38
二楼说的对  
你只new了一个对象,所以
           for (int i = 100; i < 103; i++) {
                   data.val = i;
                   list.add(data);
           }
实际上只存到了最后一次赋值data.val=102.

你将Data data = new Data();移到
           for (int i = 100; i < 103; i++) {
                   data.val = i;
                   list.add(data);
           }
循环中去试一下,应该就可以了
作者: 478883662    时间: 2015-11-8 13:58
黑夜中那颗星 发表于 2015-11-8 10:38
集合里面存入的是对象的引用地址,上面的代码循环三次存入的都是同一个对象的引用地址,说val的值是最后一 ...

nice  彻底理解了  谢谢
作者: zyh1578814923    时间: 2015-11-8 14:14
集合里面存入的是对象的引用地址
作者: 刘旭波    时间: 2015-11-8 19:57
key  value




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2