list在遍歷過程中的add/remove
阿新 • • 發佈:2018-03-04
com index 遍歷集合 很多 pub iterator clas util http
平時開發過程中,很多人估計都遇到過一個問題:在遍歷集合的的過程中,進行add或者remove操作的時候,會出現2類錯誤,包括:
java.util.ConcurrentModificationException for in遍歷過程中add/remove導致的錯誤
java.lang.IndexOutOfBoundsException 越界錯誤,for循環的時候刪除元素。
那麽我們應該怎樣避免這個問題呢?
首先對於add操作:建議利用原生的for循環。remove操作利用foreach操作
具體代碼如下:remove
add:
經典錯誤1:
什麽錯誤呢?這段代碼用於只會輸出list的第一個元素。問題出在鏈式寫法上。
每次循環時候先調用了list.iterator() 在該方法中每次都是重新new了一個新的對象
public Iterator<E> iterator() {
return new Itr();
}
所以每一次都是一個新的遍歷對象,所以輸出第一個元素。
那麽為什麽每次都要new一個新的Itr()?我猜想應該是為了並發的讀,每次讀的都是一份獨立的數據,避免多個並發讀的時候,出現當前指針問題。
處理辦法:將list.iteraotr() 放在外面即可,保證循環中循環的是1個對象。
經典錯誤2:
會陷入死循環
list在遍歷過程中的add/remove