黑马程序员技术交流社区
标题:
请教:相同执行语句,分别放在迭代器前与后,为何效果不同
[打印本页]
作者:
HM朱蛟
时间:
2013-3-31 05:12
标题:
请教:相同执行语句,分别放在迭代器前与后,为何效果不同
本帖最后由 HM朱蛟 于 2013-3-31 06:11 编辑
小弟请教:就这段代码而言,不考虑其他
同样的处理函数,同样的集合,同样的执行语句。为何换一个位置,产生的效果不同,
一个是放在创建迭代器语句之前,一个是放在其之后.
代码如下,
import java.util.*;
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
class Run
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add(new Person("haha01",1));
al.add(new Person("haha02",2));
al.add(new Person("haha01",1));
al.add(new Person("haha02",2));
al.add(new Person("haha01",1));
al.add(new Person("haha05",5));
al = killEcho(al); //为何放在这里就没有输出?
Iterator it = al.iterator();//迭代器
// al = killEcho(al); //放在这里才有输出
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"...."+p.getAge());
}
}
public static ArrayList killEcho(ArrayList list)
{
ArrayList al = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();//等于是Object obj = new Person()
if(!al.contains(obj))
al.add(obj);
}
return al;
}
public static void sop(Object obj)
{
System.out.println(obj);
}
}
复制代码
作者:
HM朱蛟
时间:
2013-3-31 05:20
这个是输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
放在迭代器之前的输出结果:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
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:47
本帖最后由 黄小贝 于 2013-3-31 05:53 编辑
撸主这是一宿没睡还是早上起来了~~~精神不错
1.png
(13.85 KB, 下载次数: 7)
下载附件
2013-3-31 05:47 上传
2.png
(41.16 KB, 下载次数: 2)
下载附件
2013-3-31 05:47 上传
3.png
(36 KB, 下载次数: 3)
下载附件
2013-3-31 05:47 上传
这里不抛出ConcurrentModificationException是因为,原来的List对象并没有被改变,只是a1这个引用指向了一个新的List,原来的没有被改变
作者:
HM朱蛟
时间:
2013-3-31 06:11
本帖最后由 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,对其迭代也没有输出结果
哎,大意啊,没有注意下面那个函数。暗箭难防啊!!以后要仔细点了。
呵呵 最近都是昼伏夜出。生物钟比较凌乱的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2