Java中ArrayList學習筆記

Java中ArrayList學習筆記

  1. 先看兩段代碼

這段代碼在執行的時候會報

但是這樣寫就好着呢:

總結,研究報錯的代碼 ,在for循環的時候調用next()方法,next方法中調用了checkForComodification這個方法,這個方法裏面判斷modCount和expectedModCount不相等的時候就拋出ConcurrentModificationException這個異常。

原因:當for循環執行的時候首先調用了

這個方法,這個方法初始化了expectedModCount=modCount,modCount的值是在add方法裏面複製的,如當前程序爲8,初始化給expectedModCount的值。當調用remove 方法的時候,將modCount++; 導致下一次循環的時候兩個值不相同,就會報這個錯誤。

這裏還有個知識點:

modCount 這個變量被transient關鍵字修飾,意思是不可被序列化。

參考文檔:https://www.cnblogs.com/chenpi/p/6185773.html

  1. 解決辦法:

for (int i = students.size() - 1; i >= 0; i--) {

if (students.get(i).equals("李四")) {
    students.remove(i);
}

}
注意倒敘刪除。正序刪除的時候由於size一直變小,可能後面的刪除不了。
Iterator iterator = students.iterator();
while (iterator.hasNext()) {

if (iterator.next().equals("李四"))
    iterator.remove();

}
用iterator的remove方法可以刪除,因爲remove方法中將expectedModCount=modCount。

  1. 多線程問題

這段代碼在執行的時候有時候會報錯,就是在方法內部調用 next方法的時候expectedModCount和modCount的值不一致引起的。

解決方案:

用CopyOnWriteArrayList方法,注意這個方法沒有實現iterator.remove()。CopyOnWriteArrayList 裏面在操作數據都用Lock進行了處理,但是有個方法getArray()沒有lock。

  1. ConcurrentHaspMap它也是線程安全的,它裏面是通過synchronized實現的。
    原文地址https://www.cnblogs.com/baoyi/p/java_arrayList.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章