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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM朱蛟 于 2013-3-31 06:11 编辑

小弟请教:就这段代码而言,不考虑其他
同样的处理函数,同样的集合,同样的执行语句。为何换一个位置,产生的效果不同,
一个是放在创建迭代器语句之前,一个是放在其之后.

代码如下,
  1. import java.util.*;

  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.         
  7.         Person(String name,int age)
  8.         {
  9.           this.name = name;
  10.           this.age = age;        
  11.         }
  12.         
  13.         public String getName()
  14.         {
  15.                 return name;        
  16.         }
  17.         
  18.         public int getAge()
  19.         {
  20.                 return age;        
  21.         }
  22. }

  23. class Run
  24. {
  25. public static void main(String[] args)
  26. {
  27.           ArrayList al = new ArrayList();
  28.          
  29.           al.add(new Person("haha01",1));
  30.           al.add(new Person("haha02",2));
  31.           al.add(new Person("haha01",1));
  32.     al.add(new Person("haha02",2));
  33.     al.add(new Person("haha01",1));
  34.     al.add(new Person("haha05",5));

  35.     al =  killEcho(al);         //为何放在这里就没有输出?

  36.           Iterator it = al.iterator();//迭代器

  37.     //  al =  killEcho(al);  //放在这里才有输出

  38.           while(it.hasNext())
  39.     {
  40.             Person p = (Person)it.next();
  41.             sop(p.getName()+"...."+p.getAge());
  42.     }
  43. }

  44. public static ArrayList killEcho(ArrayList list)
  45. {
  46.           ArrayList al = new ArrayList();
  47.          
  48.           Iterator it = al.iterator();
  49.          
  50.           while(it.hasNext())
  51.           {
  52.                    Object obj = it.next();//等于是Object obj = new Person()
  53.                   
  54.             if(!al.contains(obj))
  55.              al.add(obj);
  56.           }
  57.           return al;
  58. }

  59.          public static void sop(Object obj)
  60.         {
  61.                 System.out.println(obj);
  62.         }
  63. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
这个是输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
放在迭代器之前的输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
C:\Documents and Settings\Administrator\桌面\BH-temp>javac ArrayListTest2.java
注意:ArrayListTest2.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。

C:\Documents and Settings\Administrator\桌面\BH-temp>java Run
--------------------------------------------------------------------------------------------------------------------------------------------------------------
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
--------------------------------------------------------------------------------------------------------------------------------------------------------------
放在迭代器之后的输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
C:\Documents and Settings\Administrator\桌面\BH-temp>javac ArrayListTest2.java
注意:ArrayListTest2.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。

C:\Documents and Settings\Administrator\桌面\BH-temp>java Run
haha01....1
haha02....2
haha01....1
haha02....2
haha01....1
haha05....5
--------------------------------------------------------------------------------------------------------------------------------------------------------------
回复 使用道具 举报
本帖最后由 黄小贝 于 2013-3-31 05:53 编辑

撸主这是一宿没睡还是早上起来了~~~精神不错








这里不抛出ConcurrentModificationException是因为,原来的List对象并没有被改变,只是a1这个引用指向了一个新的List,原来的没有被改变


























评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
本帖最后由 HM朱蛟 于 2013-3-31 06:18 编辑

感谢哥们儿指出  受益匪浅!!学习了 学习了

是我大意了  55行      Iterator it = al.iterator();  手误  --> Iterator it =list.iterator();  

在错误的情况下  使用错误的函数  al =  killEcho(al);   由于,该函数里并没有使用到外面传来的List  所以使用它就得到了一个一个空List

所以  放在之后能输出是因为Iterator it = al.iterator();已经得到了一份,对它进行迭代可以输出,而放在之前,覆盖了源List,所以拿一份空List给it,对其迭代也没有输出结果

哎,大意啊,没有注意下面那个函数。暗箭难防啊!!以后要仔细点了。

呵呵  最近都是昼伏夜出。生物钟比较凌乱的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马