遍历集合比较常用的3种方式:for循环,foreach,迭代器,这几种在数据量较小的情况下区别不大。但是如果需要在遍历时删除满足条件的元素,此时foreach方式不适用,for循坏则需要注意集合长度和索引值变化,在这种情况下迭代器是最佳选择。
- Foreach
这篇文章讲解的比较清楚:https://blog.youkuaiyun.com/tmplayer/article/details/795930262
foreach在调用remove()时,会check modCount 和 expectedModCount 是否相等,如果不等则报错
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
System.out.println(list);
for(String s:list) {
if("2".equals(s)) {
list.remove(s);
}
}
System.out.println(list);
}
运行结果:
[1, 2, 2, 3]
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
2. For循环
For循坏在每次删除后需要将索引 - 1,因为删除了元素集合的大小发生了变化,若还是按照原索引值,则原集合中的下一元素将不会被遍历到(使用jdk6和jdk8测试)
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
System.out.println(list);
for(int i=0;i<list.size();i++) {
if("2".equals(list.get(i))) {
list.remove(i);
}
}
System.out.println(list);
}
运行结果:
[1, 2, 2, 3]
[1, 2, 3]
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
System.out.println(list);
for(int i=0;i<list.size();i++) {
if("2".equals(list.get(i))) {
list.remove(i);
i--;
}
}
System.out.println(list);
}
运行结果:
[1, 2, 2, 3]
[1, 3]
3. 迭代器
注意:使用iterator的remove方法,如果用集合的remove方法同样会报错
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
System.out.println(list);
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if("2".equals(item)) {
iterator.remove();
}
}
System.out.println(list);
}
运行结果:
[1, 2, 2, 3]
[1, 3]