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到了第四個位置怒医,再去循環(huán)的時候會如何炉抒?
//ArrayList有一個這個方法:
//此方法用來判斷創(chuàng)建迭代對象的時候List的modCount與現(xiàn)在List的modCount是否一樣,不一樣的話就報ConcurrentModificationException異常
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
如果是4刪了稚叹,這時候之前l(fā)ist游標(biāo)已經(jīng)到最后了焰薄,他會認(rèn)為這個順序及長度是正常的禽笑,所以不會拋出異常了。
但是如果刪掉的不是4蛤奥,則每次游標(biāo)校驗的時候他會發(fā)現(xiàn)上面的值不相等了佳镜,因為通過remove把結(jié)構(gòu)破壞了,導(dǎo)致不管是3凡桥,是5蟀伸,還是其他,都會造成錯誤缅刽。所以上面用for來實現(xiàn)的方法不可取啊掏。
以上為個人見解。
Iterator<String> iterator = lists.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
if (str.equals("1")) {
iterator.remove();
}
}
解決方案如上衰猛。
//輸出結(jié)果
[2, 3, 4, 5]
Process finished with exit code 0