您的位置:首页 > 其它

List遍历中删除元素

2015-10-21 14:04 232 查看
List遍历主要有索引下标遍历、for循环遍历和Iterator迭代遍历,索引下标和for循环在遍历中删除元素都存在问题,Iterator迭代可以实现遍历中删除元素。

索引下标遍历

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(int i = 0; i < list.size(); i++){
if(list.get(i).intValue() == 3){
list.remove(i);
}
}

System.out.println(list);
//结果 [1, 2, 2, 5, 6, 4]


List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(int i = 0; i < list.size(); i++){
if(list.get(i).intValue() == 2){
list.remove(i);
}
}

System.out.println(list);
//结果 [1, 2, 3, 5, 6, 4, 3]


遍历方式中删除元素并不会抛出异常,只是存在漏删元素的情况。

集合在删除值为3的元素时,能正确的删除两个元素。当删除值为2的元素时,只删除第一个元素。原因是删除了第一个2后,集合里的元素个数减1,后面的元素往前移了1位,导致了第二个2被遗漏了。

for循环遍历

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(Integer item : list){
if(item.intValue() == 3){
list.remove(item);
}
}

System.out.println(list);


该代码运行会抛出异常ConcurrentModificationException

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)个
at com.yihaodian.mobile.flume.client.ListDeleteTest.main(ListDeleteTest.java:19)


ConcurrentModificationException官方描述如下:

当并发修改对象,而这时对该对象的修改是不允许的,就会抛出该异常。例如,当一个线程在遍历集合的时候,其他线程不允许修改该集合。通常情况下,在遍历时修改集合,迭代结果通常是不确定的。有些迭代器检测到这种行为,就会抛出ConcurrentModificationException异常。

Iterator遍历

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer item = iterator.next();
if(item.intValue() == 2){
iterator.remove();
}
}

System.out.println(list);
//结果 [1, 3, 5, 6, 4, 3]


Iterator能正确的删除集合中的元素,在遍历中删除元素推荐用这种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: