成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于 java.util.ConcurrentModificationException 的認(rèn)識(shí)

騫諱護(hù) / 3328人閱讀

摘要:今天在遍歷的時(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 Node f = 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

相關(guān)文章

  • ConcurrentModificationException,iterator迭代問題[源碼分析]

    摘要:?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...

    zhoutk 評(píng)論0 收藏0
  • ConcurrentModificationException,iterator迭代問題[源碼分析]

    摘要:?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...

    aaron 評(píng)論0 收藏0
  • ConcurrentModificationException,iterator迭代問題[源碼分析]

    摘要:?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...

    junnplus 評(píng)論0 收藏0
  • LinkedList實(shí)現(xiàn)

    package com.nasuf.arraylist; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.NoSuchElementException; public class MyLinkedList implements Iterable { ...

    yimo 評(píng)論0 收藏0
  • Java中如何優(yōu)雅地刪除List中元素

    摘要:刪除元素后,立即跳出,則正常退出,但不能向后繼續(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中的元素...

    kelvinlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<