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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姜浩 中级黑马   /  2014-10-27 01:34  /  2242 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 姜浩 于 2014-11-8 10:21 编辑
  1. package com.itheima;

  2. /**
  3. *4、 分析运行结果,说明原理。(没有分析结果不得分)

  4.         import java.util.ArrayList;

  5.         class Data {
  6.             int val;
  7.         }

  8.         public class Test {
  9.                   public static void main(String args[]) {
  10.                            Data data = new Data();
  11.                            ArrayList<Data> list = new ArrayList<Data>();

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

  16.                     for (Data d : list) {
  17.                           System.out.println(d.val);
  18. }
  19.              }
  20.       }


  21. *
  22. * @author Administrator
  23. *
  24. */

  25. /*
  26. *
  27. * 运行结果:
  28. *                 102
  29. *                 102
  30. *                 102
  31. * 分析:
  32. *                 在下面的循环中可以看出问题,
  33. *                 for (int i = 100; i < 103; i++)
  34.                 {
  35.                         data.val = i;
  36.                         list.add(data);
  37.                 }
  38. *                 1,在for之前已经创建了Data类的实例对象data,所以在for中的3次循环时,
  39. *                 所用的data.val变量是同一个变量。也就是在3次重复的对data.val进行赋值。
  40. *                 这就会导致了,前一结果被后一结果覆盖,data.val最终结果为102。
  41. *
  42. *                 2,list.add(data);  data代表是Data类对象的引用,因为list集合的可重复特点,
  43. *                 for循环中list 3次存储了Data类对象的引用,切存储的是同一对象。
  44. *                 这一点可以通过:System.out.println(list);可以看出。
  45. *                 
  46. *                 3,                for (Data d : list)
  47.                                 {
  48.                                         System.out.println(d.val);
  49.                                 }
  50.                 这时d循环取到是同一个data对象,又因之前data.val最终赋值为102,
  51.                 所以打印结果为102
  52.                                          102
  53.                                          102
  54. *                 
  55. */

  56. import java.util.ArrayList;

  57. class Data
  58. {
  59.         int val;
  60. }

  61. public class Test4
  62. {
  63.         public static void main(String args[])
  64.         {
  65.                 Data data = new Data();
  66.                 ArrayList<Data> list = new ArrayList<Data>();

  67.                 for (int i = 100; i < 103; i++)
  68.                 {
  69.                         data.val = i;//102
  70.                         list.add(data);// Data类对象的引用
  71.                 }

  72.                 for (Data d : list)
  73.                 {
  74.                         System.out.println(d.val);
  75.                 }
  76.                 //                System.out.println(list);
  77.         }
  78. }
复制代码
大家给点意见,能不能看懂?这样作答可以吗?谢谢大家。

11 个回复

倒序浏览
我个人觉得你的回答已经挺好了,这个题就是,往arraylist集合里存储了三个对象,在arraylist存储的都是同一个对象的地址值。(不好意思,我也不太清楚,集合存储的是不是对象的地址值呀?有知道的帮我解答一下,集合低层是怎么存储的)
回复 使用道具 举报
我觉得解释的很到位呀,赞一个
回复 使用道具 举报
还是可以看懂的,就是d.val不太用过,看起来可能费点劲
回复 使用道具 举报
第 59 行,List 中保存三个引用,这三个引用指向同一个内存地址,而内存地址中的值最终被修改为102,这也就是三个引用指向的值。道理你懂但好像没说的太清楚
回复 使用道具 举报
MeryStyle 发表于 2014-10-27 11:33
第 59 行,List 中保存三个引用,这三个引用指向同一个内存地址,而内存地址中的值最终被修改为102,这也就 ...

终于看到一个说得很精准的回答。
回复 使用道具 举报
水一发                  
回复 使用道具 举报
ジ旋律 来自手机 中级黑马 2014-10-27 16:18:38
8#
我顶一个
回复 使用道具 举报
我来顶一下
回复 使用道具 举报
嘿嘿~~楼主我来了:)

评分

参与人数 1黑马币 +20 收起 理由
姜浩 + 20

查看全部评分

回复 使用道具 举报
可以的,这个回答很好了。我刚刚就错了,没注意data对象只有一个,在集合中存储的都是对象的引用
回复 使用道具 举报
以后就牛逼了呵呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马