java 迭代器 正确使用,先创建一个List,填充一些元素,如下:
List<String> list = new ArrayList();
list.add("abc");
list.add("abcd");
list.add("abcde");
list.add("ABC");
list.add("ABCD");
现对“ABCD” 进行remove 操作:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
String item = iterator.next();
//System.out.println(iterator.next());
if(item.equals("ABCD"))
{
list.remove(item);
System.out.println("remove");
}else
{
System.out.println(item);
}
}
System.out.println(list.toString());
运行,结果报错:
abc
abcd
abcde
ABC
Exception in thread "main" remove
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at ListDemo.main(ListDemo.java:21)
原因在在于remove 操作应该是迭代器操作,而不是List 操作,修改如下:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
String item = iterator.next();
//System.out.println(iterator.next());
if(item.equals("ABCD"))
{
iterator.remove();
System.out.println("remove");
}else
{
System.out.println(item);
}
}
System.out.println(list.toString());
代码没有异常,且正常输出:
abc
abcd
abcde
ABC
remove
[abc, abcd, abcde, ABC]
还有一个容易犯错的地方,代码如下:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
{
//String item = iterator.next();
//System.out.println(iterator.next());
if(iterator.next().equals("ABCD"))
{
iterator.remove();
System.out.println("remove");
}else
{
System.out.println(iterator.next());
}
}
System.out.println(list.toString());
输出如下:
abcd
ABC
remove
[abc, abcd, abcde, ABC]
数据是remove 掉了,但是 while 循环里并没有正确输出,这是怎么回事?
原因在 iterator.next() 调用了两次,正确的做法应该是:
String item = iterator.next();
不应该调用多次,产出不可预测的结果。