黑马程序员技术交流社区

标题: 执行ListTest.main的结果是什么?(此题需写出分析过程) [打印本页]

作者: せR3n、何必装纯    时间: 2011-11-22 14:43
标题: 执行ListTest.main的结果是什么?(此题需写出分析过程)
lass 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);
            list.add(data);
     }

        int j = 0;
        while (j < list.size()) {
                  Data tmp = (Data )list.get(j);
                  System.out.println("list(" + j + ") = " + tmp.getVal());
                 j++;
        }
  }
}
作者: tintick    时间: 2011-11-22 15:32
这里list集合里面装入的都是同一个对象!每次循环都回重新设置 i 的值,于是data中 i 的值在变。由于list集合是有序的,因此允许加入多次同一个对象。
作者: tintick    时间: 2011-11-22 15:37
改用hashset存储的话效果就很明显了  只能打印出一个值。
作者: 冯敏    时间: 2011-11-22 16:17
输出结果为:
list(0) = 102
list(1) = 102
list(2) = 102
我想这不是你想要的结果吧,先分析一下再说,
首先实例化一个Data和list的对象,然后执行for循环,
i=100时,把Data中的vail属性值赋为100,把Data类对象放入list,
i=101时,把Data中的vail属性值赋为101,把Data类对象放入list,
i=102时,把Data中的vail属性值赋为102,把Data类对象放入list,
那么循环三次都是把同一对象放入了ArrayList里面,所以会出现上面的结果,如果想要存放100、101、103在for循环内实例化Data对象就好啦,代码如下:
Data data = null;
      ArrayList list = new ArrayList();
      for (int i=100; i<103; i++) {
              data = new Data();
        data.setVal(i);
        list.add(data);
}







作者: 宿万涛    时间: 2011-11-22 17:17
输出结果:
list(0) = 102
list(1) = 102
list(2) = 102
你在这行代码前面加个断点 Data tmp = (Data )list.get(j);
debug后,你会发现,temp的值一直没变。




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