List list=new ArrayList();
list.add(new Object);
list.add(new Object);
list.add(new Object);
list.removeAll(list.subList(1,2));
大家觉得这段代码会出问题么
谁能解释下具体的原理性的错误在哪,本人猜测是递归问题,但是具体还没想通
list.add(new Object);
list.add(new Object);
list.add(new Object);
list.removeAll(list.subList(1,2));
大家觉得这段代码会出问题么
谁能解释下具体的原理性的错误在哪,本人猜测是递归问题,但是具体还没想通
与此差不多的意思,你不能在迭代一个集合的时候,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);
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是迭代器的对象
}
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//修改一个会造成另一个的改动
改为:
list.removeAll(new ArrayList(list.subList(1,2)));
这样也可以。