List原理性问题

allvictory 2010-04-06 11:12:41
List list=new ArrayList();
list.add(new Object);
list.add(new Object);
list.add(new Object);
list.removeAll(list.subList(1,2));
大家觉得这段代码会出问题么
谁能解释下具体的原理性的错误在哪,本人猜测是递归问题,但是具体还没想通
...全文
317 11 打赏 收藏 转发到动态 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
allvictory 2010-04-07
  • 打赏
  • 举报
回复
谢谢楼上各位,不管个人感觉还没到G点

ist list=new ArrayList();
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
list.add(o1);
list.add(o2);
list.add(o3);
Iterator it = list.iterator();
while(it.hasNext()) {
Object o = it.next();
// list.remove(o);
it.remove();//实际上这段代码是可以通过的,it是迭代器的对象
}

justlearn 2010-04-07
  • 打赏
  • 举报
回复
看下下面运行结果就知道了
subList并没有创建新对象,只是原来对象的引用
所以修改时候造成了并发错误

List list=new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
List subList = list.subList(1,3);

System.out.println("sublist:[size]"+subList.size());
System.out.println("list:[size]"+list.size());
System.out.println(list.get(1));
System.out.println(subList.get(0));
System.out.println(list.get(2));
System.out.println(subList.get(1));
subList.set(1, new Object());
System.out.println(list.get(2));
System.out.println(subList.get(1));


运行结果:
sublist:[size]2
list:[size]3
java.lang.Object@1fb8ee3
java.lang.Object@1fb8ee3
java.lang.Object@61de33
java.lang.Object@61de33
java.lang.Object@14318bb
java.lang.Object@14318bb//修改一个会造成另一个的改动
zhuyouyong 2010-04-07
  • 打赏
  • 举报
回复
顶[Quote=引用 1 楼 justlearn 的回复:]
subList和removeAll操作的是同一个对象
[/Quote]
awusoft 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 justlearn 的回复:]
subList和removeAll操作的是同一个对象
[/Quote]

与此差不多的意思,你不能在迭代一个集合的时候,remove这个集合的对象.
问题转换:

List list=new ArrayList();
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
list.add(o1);
list.add(o2);
list.add(o3);
Iterator it = list.iterator();
while(it.hasNext())
{
Object o = it.next();
list.remove(o);
}

而removerAll中的源代码则是:

public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}

所以是不能这样做的,
改造一下:

List list=new ArrayList();
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
list.add(o1);
list.add(o2);
list.add(o3);
List list2=new ArrayList();
list.add(o2);
list.add(o3);
list.removeAll(list2);
jacky花园 2010-04-07
  • 打赏
  • 举报
回复

迭代器是有很多限制的
不能在迭代的同时进行其他操作(我达内的老师说的)
awusoft 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 allvictory 的回复:]
谢谢楼上各位,不管个人感觉还没到G点

ist list=new ArrayList();
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
list.add(o1);
list.add(o2);
list.add(o3);
Iterator it = list.……
[/Quote]

恩,还是楼主细心.是个问题.
coolbamboo2008 2010-04-07
  • 打赏
  • 举报
回复
学习了
Ark032425 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 awusoft 的回复:]
引用 1 楼 justlearn 的回复:
subList和removeAll操作的是同一个对象


与此差不多的意思,你不能在迭代一个集合的时候,remove这个集合的对象.
问题转换:

Java code

List list=new ArrayList();
Object o1 = new Object();
Object o2 = n……
[/Quote]
详细
angelcaoxian 2010-04-07
  • 打赏
  • 举报
回复
list.removeAll(list.subList(1,2));
改为:
list.removeAll(new ArrayList(list.subList(1,2)));
这样也可以。
justlearn 2010-04-06
  • 打赏
  • 举报
回复
subList和removeAll操作的是同一个对象
相关推荐

62,568

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告