public static void main(String[] args) {
List<String> lists = new ArrayList<>();
lists.add("1");
lists.add("2");
lists.add("3");
lists.add("4");
lists.add("5");
for (String str : lists) {
if (str.equals("4")) {
lists.remove(str);
}
}
System.out.println(lists);
}
试想上述代码是否会报错?
思考点在list长度是5,然后在第4的时候,把序列4移除了,这时候序列5到了第四个位置,再去循环的时候会如何?
//ArrayList有一个这个方法:
//此方法用来判断创建迭代对象的时候List的modCount与现在List的modCount是否一样,不一样的话就报ConcurrentModificationException异常
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果是4删了,这时候之前list游标已经到最后了,他会认为这个顺序及长度是正常的,所以不会抛出异常了。
但是如果删掉的不是4,则每次游标校验的时候他会发现上面的值不相等了,因为通过remove把结构破坏了,导致不管是3,是5,还是其他,都会造成错误。所以上面用for来实现的方法不可取。
以上为个人见解。
Iterator<String> iterator = lists.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (str.equals("1")) {
iterator.remove();
}
}
解决方案如上。
//输出结果
[2, 3, 4, 5]
Process finished with exit code 0