Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结

时间:2024-10-13 13:34:08

首先。这是一个极其简单的问题,大牛可忽略。新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常。

这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有效的实现遍历list删除某些特征元素?

方式:

方法1、普通for循环 遍历List,删List除自身 特征条目;

方法2、高级for循环 遍历List。删除List自身 特定条目;

方法3、引入參考List。for循环遍历删除原List 特定条目;

方法4、利用iterator 遍历删除List特定条目

结论:

方法1:不会抛异常 但结果 未必正确 因为list.size()在变动 依据脚标删除的未必是 特征元素;

方法2:会抛异常
:java.util.ConcurrentModificationException;

java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)

at java.util.ArrayList$Itr.next(ArrayList.java:791)

方法3:可实现目的,通过引入一个參考list for循环遍历參考list 在循环过程中 满足条件出 删除原list条目。能够达到所需目的。

方法4:可实现目的。通过list.iterator();方法拿到iterator对象 调用iterator.remove();方法可达到所需目的且不会抛异常。

这个问题 最好亲自执行代码。尝试,方能更好理解。

不废话。上代码,自己执行一下便可:

package com.kevin.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random; /**
* 动态删除 List 特征元素 演示样例
*
* @author blj
*
*/
public class TestMain
{ static class Bean
{ private String name; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} } /**
* @param args
*/
public static void main(String[] args)
{ dynamicRemoveItemFromListDemo();
} /**
* 动态删除List元素演示样例
*/
public static void dynamicRemoveItemFromListDemo()
{ List<Bean> list = getList(); System.out.println("原始数据:");
printList(list); // 使用普通for循环遍历List删除自身元素 不报错 但结果 未必正确
normalRemoveMethod(list); // 使用高级for循环遍历List删除自身元素 报错
// try
// {
// superRemoveMethod(list);
// }
// catch (Exception e)
// {
// System.err.println("高级for循环报错:");
// e.printStackTrace();
// } // 引入參考List 遍历删除方法
// referenceRemoveMethod(list); // iterator遍历删除方法
// iteratorRemoveMethod(list); System.out.println("结果数据:");
printList(list); } /**
* 打印 List 方法
*
* @param list
*/
private static void printList(List<Bean> list)
{
for (Bean item : list)
{
System.out.print(item.getName() + " ");
}
System.out.println();
} /**
* 利用普通for循环遍历删除元素
*
* @param list
*/
private static void normalRemoveMethod(List<Bean> list)
{
for (int i = 0; i < list.size(); i++)
{
if (list.get(i).getName().equals("A"))
{
list.remove(list.get(i));
}
}
} /**
* 利用高级for循环遍历删除元素(会报异常)
*
* @param list
*/
private static void superRemoveMethod(List<Bean> list)
{
// 方法一
for (Bean item : list)
{
if (item.getName().equals("A"))
{
list.remove(item);
}
}
} /**
* 有效的for循环遍历删除元素(正常 达到预期目的)
*
* @param list
*/
private static void referenceRemoveMethod(List<Bean> list)
{
List<Bean> referenceList = new ArrayList<Bean>();
referenceList.addAll(list); for (int i = 0; i < referenceList.size(); i++)
{
if (referenceList.get(i).getName().equals("A"))
{
list.remove(referenceList.get(i));
}
}
} /**
* 使用Iterator的方式也能够顺利删除和遍历
*/
public static void iteratorRemoveMethod(List<Bean> list)
{
Iterator<Bean> it = list.iterator();
while (it.hasNext())
{
Bean student = it.next();
if (student.getName().equals("A"))
it.remove();
}
} /**
* 获取List方法
*
* @return
*/
private static List<Bean> getList()
{
List<Bean> list = new ArrayList<Bean>(); for (int i = 0; i < 50; i++)
{
Bean item = new Bean();
int j = i + new Random().nextInt();
if (j % 3 == 1)
{
item.setName("A");
}
else if (j % 3 == 2)
{
item.setName("B");
}
else
{
item.setName("C");
} list.add(item);
}
return list;
} }