求助,关于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请忽略
展开
 我来答
568145421
2012-08-23 · 知道合伙人软件行家
568145421
知道合伙人软件行家
采纳数:1353 获赞数:6756

向TA提问 私信TA
展开全部
你好。原因在这里。关键你的这个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)的时候,他相当于对这片内存一边遍历一边移除,在这种并发修该的情况下,会产生不确定的结果,所以就不允许这样的操作,就会抛异常。
解决办法就是新开辟内存。重新赋值。
wdx5514335
2012-08-23 · 超过10用户采纳过TA的回答
知道答主
回答量:84
采纳率:0%
帮助的人:35.2万
展开全部
不可以在遍历的过程中删除list中的元素,可以先把要删除的元素保存起来,
List <String> delList =sub;
list.removeAll(deList);
追问
我并没有在代码中写遍历的语句啊,为什么会在遍历list呢?而且照你那样修改仍然会抛异常
追答
之前看错了,额,这么讲吧,subList在使用迭代器的时候线程是锁死的,不可以修改元素。
你这样List sub = new ArrayList(list.subList(2, 6));
应该就可以,重新保存迭代后的结果
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2012-08-23
知道答主
回答量:3
采纳率:0%
帮助的人:4278
展开全部
做设计的买什么手提电脑比较合适(台式不合适,现在需手提电脑)。求高手指导。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南炕蜒非黑寄C0
2012-08-23 · 超过25用户采纳过TA的回答
知道答主
回答量:512
采纳率:0%
帮助的人:138万
展开全部
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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式