摘要:今天在遍歷的時(shí)候,添加了一些元素進(jìn)去,然后拋出這個(gè)異常。實(shí)質(zhì)是不允許修改當(dāng)前遍歷的長(zhǎng)度的。并不是刪除,按理來說是不會(huì)修改這個(gè)值的。是用數(shù)組實(shí)現(xiàn)的。這個(gè)是對(duì)于刪除來說比較通用的方法。我是用另外要給暫時(shí)存放需要的添加的元素。
今天在遍歷arrayList的時(shí)候,添加了一些元素進(jìn)去,然后拋出ConcurrentModificationException 這個(gè)異常。然后就去網(wǎng)上找了下資料,拋出這個(gè)異常的原因是因?yàn)?,list 集合 在遍歷的時(shí)候是不允許修改list的。實(shí)質(zhì)是不允許修改當(dāng)前遍歷list的長(zhǎng)度的。
在 arrayList 和 linkedList 的實(shí)現(xiàn)里 都一個(gè) modCount 這個(gè)遍歷。 對(duì)于arrayList,在調(diào)用remove 和 clean 方法的時(shí)候,會(huì)修改 modCount 這個(gè)變量的值。在遍歷的時(shí)候這個(gè)值被修改了。就會(huì)報(bào)錯(cuò)。 但我是對(duì)arrayList 添加元素。并不是刪除,按理來說是不會(huì)修改modCount 這個(gè)值的。 可還是報(bào)錯(cuò)了。后來查看了源碼。arrayList是用數(shù)組實(shí)現(xiàn)的。當(dāng)你添加元素的時(shí)候,實(shí)現(xiàn)是會(huì)去檢查數(shù)組的大小,是否需要擴(kuò)容。問題就在這里,在擴(kuò)容的時(shí)候,是會(huì)修改modCount 這個(gè)值的。
代碼入下
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! 次方法用來檢查是否要擴(kuò)大數(shù)組的大小 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { if (elementData == EMPTY_ELEMENTDATA) { // 加入 數(shù)組還是為空話,選擇默認(rèn)的大小 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } //擴(kuò)大數(shù)組的大小 ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code 傳入進(jìn)來的容量必須大于當(dāng)前的容量 if (minCapacity - elementData.length > 0) grow(minCapacity); }
對(duì)于linkedList 的話 你調(diào)用add 方法的時(shí)候就直接修改modCount 的值了。 因?yàn)閘inkedList是用鏈表實(shí)現(xiàn)的。所以每一次添加其實(shí)都是在修改集合的大小。
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++; }
那我們需要就是要修改大小怎么辦呢?
對(duì)于 刪除元素的話,我們可以用迭代器,然后使用迭代器的 remove 的方法。這個(gè)是對(duì)于刪除來說比較通用的方法。
假如是要添加元素的的話。我沒有找到很好的方法。我是用另外要給list 暫時(shí)存放需要的添加的元素。等遍歷完以后,再把,需要添加的元素一起放進(jìn)去。不知哪位高人有更好的方法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66603.html
摘要:?jiǎn)尉€程的迭代過程中刪除集合元素以上代碼會(huì)出現(xiàn)如下異常從后往前看第行代碼我們?cè)趫?zhí)行代碼行時(shí)調(diào)用了這個(gè)是調(diào)用返回的對(duì)象這個(gè)對(duì)象的方法如下圖方法首先它會(huì)調(diào)用這個(gè)方法這個(gè)方法很簡(jiǎn)單就是比較這兩個(gè)值是不是相等不相等就拋出異常如下圖這兩個(gè)值為什么會(huì)不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...
摘要:?jiǎn)尉€程的迭代過程中刪除集合元素以上代碼會(huì)出現(xiàn)如下異常從后往前看第行代碼我們?cè)趫?zhí)行代碼行時(shí)調(diào)用了這個(gè)是調(diào)用返回的對(duì)象這個(gè)對(duì)象的方法如下圖方法首先它會(huì)調(diào)用這個(gè)方法這個(gè)方法很簡(jiǎn)單就是比較這兩個(gè)值是不是相等不相等就拋出異常如下圖這兩個(gè)值為什么會(huì)不相 單線程的Iterator迭代過程中刪除集合元素 public class TestIterator { public static voi...
摘要:?jiǎn)尉€程的迭代過程中刪除集合元素以上代碼會(huì)出現(xiàn)如下異常從后往前看第行代碼我們?cè)趫?zhí)行代碼行時(shí)調(diào)用了這個(gè)是調(diào)用返回的對(duì)象這個(gè)對(duì)象的方法如下圖方法首先它會(huì)調(diào)用這個(gè)方法這個(gè)方法很簡(jiǎn)單就是比較這兩個(gè)值是不是相等不相等就拋出異常如下圖這兩個(gè)值為什么會(huì)不相 單線程的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 { ...
摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續(xù)循環(huán)了刪除后立馬終端循環(huán),會(huì)正常跳出,但代價(jià)是不能繼續(xù)向后循環(huán)了使用迭代器使用迭代器可,正確無誤的刪除,代碼簡(jiǎn)潔優(yōu)雅,推薦使用使用迭代器可,正確無誤的刪除注意這里時(shí)而不是 在工作中的許多場(chǎng)景下,我們都會(huì)使用到List這個(gè)數(shù)據(jù)結(jié)構(gòu),那么同樣的有很多場(chǎng)景下需要?jiǎng)h除List中的某一個(gè)元素或某幾個(gè)元素,那么我們?cè)撊绾握_無誤地刪除List中的元素...
閱讀 2465·2021-11-22 09:34
閱讀 3073·2021-10-25 09:43
閱讀 1987·2021-10-11 10:59
閱讀 3398·2021-09-22 15:13
閱讀 2334·2021-09-04 16:40
閱讀 426·2019-08-30 15:53
閱讀 3196·2019-08-30 11:13
閱讀 2610·2019-08-29 17:30