摘要:今天在遍歷的時候,添加了一些元素進去,然后拋出這個異常。實質是不允許修改當前遍歷的長度的。并不是刪除,按理來說是不會修改這個值的。是用數組實現的。這個是對于刪除來說比較通用的方法。我是用另外要給暫時存放需要的添加的元素。
今天在遍歷arrayList的時候,添加了一些元素進去,然后拋出ConcurrentModificationException 這個異常。然后就去網上找了下資料,拋出這個異常的原因是因為,list 集合 在遍歷的時候是不允許修改list的。實質是不允許修改當前遍歷list的長度的。
在 arrayList 和 linkedList 的實現里 都一個 modCount 這個遍歷。 對于arrayList,在調用remove 和 clean 方法的時候,會修改 modCount 這個變量的值。在遍歷的時候這個值被修改了。就會報錯。 但我是對arrayList 添加元素。并不是刪除,按理來說是不會修改modCount 這個值的。 可還是報錯了。后來查看了源碼。arrayList是用數組實現的。當你添加元素的時候,實現是會去檢查數組的大小,是否需要擴容。問題就在這里,在擴容的時候,是會修改modCount 這個值的。
代碼入下
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! 次方法用來檢查是否要擴大數組的大小 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { // 加入 數組還是為空話,選擇默認的大小 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } //擴大數組的大小 ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code 傳入進來的容量必須大于當前的容量 if (minCapacity - elementData.length > 0) grow(minCapacity); }
對于linkedList 的話 你調用add 方法的時候就直接修改modCount 的值了。 因為linkedList是用鏈表實現的。所以每一次添加其實都是在修改集合的大小。
private void linkFirst(E e) { final Nodef = first; final Node newNode = new Node<>(null, e, f); first = newNode; if (f == null) last = newNode; else f.prev = newNode; size++; modCount++; }
那我們需要就是要修改大小怎么辦呢?
對于 刪除元素的話,我們可以用迭代器,然后使用迭代器的 remove 的方法。這個是對于刪除來說比較通用的方法。
假如是要添加元素的的話。我沒有找到很好的方法。我是用另外要給list 暫時存放需要的添加的元素。等遍歷完以后,再把,需要添加的元素一起放進去。不知哪位高人有更好的方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66603.html
摘要:單線程的迭代過程中刪除集合元素以上代碼會出現如下異常從后往前看第行代碼我們在執行代碼行時調用了這個是調用返回的對象這個對象的方法如下圖方法首先它會調用這個方法這個方法很簡單就是比較這兩個值是不是相等不相等就拋出異常如下圖這兩個值為什么會不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...
摘要:單線程的迭代過程中刪除集合元素以上代碼會出現如下異常從后往前看第行代碼我們在執行代碼行時調用了這個是調用返回的對象這個對象的方法如下圖方法首先它會調用這個方法這個方法很簡單就是比較這兩個值是不是相等不相等就拋出異常如下圖這兩個值為什么會不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...
摘要:單線程的迭代過程中刪除集合元素以上代碼會出現如下異常從后往前看第行代碼我們在執行代碼行時調用了這個是調用返回的對象這個對象的方法如下圖方法首先它會調用這個方法這個方法很簡單就是比較這兩個值是不是相等不相等就拋出異常如下圖這兩個值為什么會不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...
package com.nasuf.arraylist; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class MyLinkedList implements Iterable { ...
摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續循環了刪除后立馬終端循環,會正常跳出,但代價是不能繼續向后循環了使用迭代器使用迭代器可,正確無誤的刪除,代碼簡潔優雅,推薦使用使用迭代器可,正確無誤的刪除注意這里時而不是 在工作中的許多場景下,我們都會使用到List這個數據結構,那么同樣的有很多場景下需要刪除List中的某一個元素或某幾個元素,那么我們該如何正確無誤地刪除List中的元素...
閱讀 2459·2021-11-22 09:34
閱讀 3066·2021-10-25 09:43
閱讀 1981·2021-10-11 10:59
閱讀 3382·2021-09-22 15:13
閱讀 2330·2021-09-04 16:40
閱讀 423·2019-08-30 15:53
閱讀 3190·2019-08-30 11:13
閱讀 2607·2019-08-29 17:30