以前一直没有注意,最近发现list在循环中使用remove方法其实是有问题的
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for (String temp : list) {
if ("3".equals(temp)) {
list.remove(temp);
}
}
这种写法,会造成java.util.ConcurrentModificationException异常
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
if ("1".equals(list.get(i))) {
list.remove(i);
}
}
而这种写法,打印时会发现遍历list未遍历所有元素,只打印了1和3
造成这些情况的原因很简单,循环时remove掉List的元素,对象list的大小发生了变化,循环的索引也就发生了变化。
为避免以上情况发生,感觉还是用迭代器比较靠谱,使用Iterator的remove方法,具体做法如下:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String temp = it.next();
if ("3".equals(temp)) {
it.remove();
}
}