求助,关于Java中的List<E>的removeAll使用时出现的问题
packageTest;importjava.util.*;publicclassTest1{publicstaticvoidmain(String[]args){Lis...
package Test;
import java.util.*;
public class Test1
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8"));
System.out.println(list);
List<String> sub = list.subList(2, 6);
System.out.println(sub);
list.removeAll(sub);
System
}
}
在list.removeAll(sub);这一行,总是会抛出异常
输出如下:
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 4, 5, 6]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.SubList.checkForComodification(Unknown Source)
at java.util.SubList.listIterator(Unknown Source)
at java.util.AbstractList.listIterator(Unknown Source)
at java.util.SubList.iterator(Unknown Source)
at java.util.AbstractCollection.contains(Unknown Source)
at java.util.AbstractCollection.removeAll(Unknown Source)
at Test.Test1.main(Test1.java:13)
最后一个System请忽略 展开
import java.util.*;
public class Test1
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>(Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8"));
System.out.println(list);
List<String> sub = list.subList(2, 6);
System.out.println(sub);
list.removeAll(sub);
System
}
}
在list.removeAll(sub);这一行,总是会抛出异常
输出如下:
[1, 2, 3, 4, 5, 6, 7, 8]
[3, 4, 5, 6]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.SubList.checkForComodification(Unknown Source)
at java.util.SubList.listIterator(Unknown Source)
at java.util.AbstractList.listIterator(Unknown Source)
at java.util.SubList.iterator(Unknown Source)
at java.util.AbstractCollection.contains(Unknown Source)
at java.util.AbstractCollection.removeAll(Unknown Source)
at Test.Test1.main(Test1.java:13)
最后一个System请忽略 展开
4个回答
展开全部
你好。原因在这里。关键你的这个List构件的时候是用的
Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8")
这个返回的List集合是不可以添加元素或者删除(移除)元素的。
不信你试试看。
正式因为你去操作这个,所以才会有异常的。
Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8")
这个返回的List集合是不可以添加元素或者删除(移除)元素的。
不信你试试看。
正式因为你去操作这个,所以才会有异常的。
追问
String[] strs = {"1", "2", "3", "4", "5", "6", "7", "8"};
List list = new ArrayList();
for(int i=0; i sub = list.subList(2, 6);
System.out.println(sub);
list.removeAll(sub);
System.out.println(list);
改成这样构造后依然抛异常啊
追答
看了你的例子,我仔细想了下。是这样子的。
List sub = list.subList(2, 6);
并没有创建新的对象,而仅仅是用sub这个引用指向了原来的内存中的2-6的那片区域。
所以在调用list.removeAll(sub)的时候,他相当于对这片内存一边遍历一边移除,在这种并发修该的情况下,会产生不确定的结果,所以就不允许这样的操作,就会抛异常。
解决办法就是新开辟内存。重新赋值。
展开全部
不可以在遍历的过程中删除list中的元素,可以先把要删除的元素保存起来,
List <String> delList =sub;
list.removeAll(deList);
List <String> delList =sub;
list.removeAll(deList);
追问
我并没有在代码中写遍历的语句啊,为什么会在遍历list呢?而且照你那样修改仍然会抛异常
追答
之前看错了,额,这么讲吧,subList在使用迭代器的时候线程是锁死的,不可以修改元素。
你这样List sub = new ArrayList(list.subList(2, 6));
应该就可以,重新保存迭代后的结果
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
做设计的买什么手提电脑比较合适(台式不合适,现在需手提电脑)。求高手指导。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
List<String> list = new ArrayList<String>(Arrays.asList("1", "2", "3",
"4", "5", "6", "7", "8"));
System.out.println(list);
List<String> sb= list.subList(2, 6);
System.out.println(sb);
list.removeAll(sb);
"4", "5", "6", "7", "8"));
System.out.println(list);
List<String> sb= list.subList(2, 6);
System.out.println(sb);
list.removeAll(sb);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询