ArrayList循环遍历并删除元素的常见陷阱
在工作和学习中,经常碰到删除ArrayList里面的某个元素,看似一个很简单的问题,却很容易出bug。不妨把这个问题当做一道面试题目,我想一定能难道不少的人。今天就给大家说一下在ArrayList循环遍历并删除元素的问题。首先请看下面的例子:
import java.util.ArrayList;
public class ArrayListRemove
{
publicstaticvoidmain(String[]args)
{
ArrayList<String>list=newArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
remove(list);
for(Strings:list)
{
System.out.println("element : "+s);
}
}
public static void remove(ArrayList<String> list)
{
// TODO:
}
}
如果要想删除list的b字符,有下面两种常见的错误例子:
错误写法实例一
public static void remove(ArrayList<String> list)
{
for(inti=0;i<list.size();i++)
{
Strings=list.get(i);
if(s.equals("b"))
{
list.remove(s);
}
}
}
错误的原因:这种最普通的循环写法执行后会发现第二个“b”的字符串没有删掉。
错误写法实例二
public static void remove(ArrayList<String> list)
{
for(Strings:list)
{
if(s.equals("b"))
{
list.remove(s);
}
}
}
错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException。
解决方法
- 第一种采用倒序删除,因为倒序遍历即使发生元素删除也不影响后续元素的遍历
public static void remove(ArrayList<String> list)
{
for(inti=list.size()-1;i>=0;i--)
{
Strings=list.get(i);
if(s.equals("b"))
{
list.remove(s);
}
}
}
- 第二种采用Iterator的remove,不采用ArrayList的remove
public static void remove(ArrayList<String> list)
{
Iterator<String> it = list.iterator();
while (it.hasNext())
{
String s = it.next();
if (s.equals("b"))
{
it.remove();
}
}
}