A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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,为什么啊 不懂

8 个回复

倒序浏览
你这段代码里面只有一个Data对象,for循环到最后一次把data的val赋值为102,其实集合中存放了3个重复的Data对象
回复 使用道具 举报
楼上的头像有味道。~
回复 使用道具 举报
余旋 发表于 2015-11-8 00:35
你这段代码里面只有一个Data对象,for循环到最后一次把data的val赋值为102,其实集合中存放了3个重复的Data ...

是不是List  add的是对对象的引用,然后这3次循环改变了所引用的对象里的值,所以最终打印的3个val都是最后一个102.
回复 使用道具 举报
集合里面存入的是对象的引用地址,上面的代码循环三次存入的都是同一个对象的引用地址,说val的值是最后一次循环改变的值
回复 使用道具 举报
二楼说的对  
你只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);
           }
循环中去试一下,应该就可以了
回复 使用道具 举报
黑夜中那颗星 发表于 2015-11-8 10:38
集合里面存入的是对象的引用地址,上面的代码循环三次存入的都是同一个对象的引用地址,说val的值是最后一 ...

nice  彻底理解了  谢谢
回复 使用道具 举报
集合里面存入的是对象的引用地址
回复 使用道具 举报
key  value
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马