最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java集合刪除元素ArrayList實(shí)例詳解

 更新時(shí)間:2017年04月26日 10:20:02   投稿:lqh  
這篇文章主要介紹了Java集合刪除元素ArrayList實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

Java集合刪除元素ArrayList實(shí)例詳解

AbstractCollection集合類(lèi)中有一個(gè)remove方法,該方法為了適配多種不同的集合,允許刪除空的元素,看這部分代碼的時(shí)候產(chǎn)生了疑問(wèn),為什么這里直接用it.remove()就直接刪除了?

public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
      while (it.hasNext()) {
        if (it.next()==null) {
          it.remove();
          return true;
        }
      }
    } else {
      while (it.hasNext()) {
        if (o.equals(it.next())) {
          it.remove();
          return true;
        }
      }
    }
    return false;
  }

接下來(lái),拿ArrayList為例子,進(jìn)行說(shuō)明。其繼承結(jié)構(gòu)如下圖所示。并且,ArrayList內(nèi)部有其使用的Iterator的實(shí)現(xiàn)類(lèi)。

編寫(xiě)一段測(cè)試代碼:

AbstractCollection<String> list = new ArrayList<>();
    list.add("a");
    list.add(null);
    list.add(null);

    Iterator<String> iter = list.iterator();
    while(iter.hasNext()) {
      if(iter.next() == null) {
        iter.remove();
      }
    }
    System.out.println(list);

關(guān)鍵點(diǎn)還是在于iter.next() == null 這一行,next的源碼如下:

 public E next() {
      checkForComodification();
      int i = cursor;
      if (i >= size)
        throw new NoSuchElementException();
      Object[] elementData = ArrayList.this.elementData;
      if (i >= elementData.length)
        throw new ConcurrentModificationException();
      cursor = i + 1;
      return (E) elementData[lastRet = i];
    }

cusor在這里表示的是遍歷時(shí)的索引,在調(diào)用next方法的時(shí)候其實(shí)cusor已經(jīng)指向了當(dāng)前元素的下一個(gè)元素,而使用lasrRet來(lái)獲取當(dāng)前的索引上的數(shù)據(jù)并將其返回。

而remove()方法中是通過(guò)lastRet的索引進(jìn)行刪除的。

  public void remove() {
      if (lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();

      try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
      }
    }

借助上文中提到的測(cè)試實(shí)例,可以進(jìn)行每一步的推算。

1. 調(diào)用next()方法,cursor指向0號(hào)元素,i被賦值為cursor的值,然后cursor被修改為i+1,指向了1號(hào)元素,也就是null所在的位置, lastRet被賦值為0。
2. 調(diào)用next()方法,cursor指向了1號(hào)元素,賦值給i,然后cursor又通過(guò)i+1遞增變?yōu)?,lastRet被賦值為1
3. 執(zhí)行刪除,刪除該集合lastRet上所代表的元素。刪除完成后修改cursor指針同時(shí)使得expectedModCount和modCount保持一致避免fastfail。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java方法重載Overload原理及使用解析

    Java方法重載Overload原理及使用解析

    這篇文章主要介紹了Java方法重載Overload原理及使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 一篇文章教你用Java使用JVM工具檢測(cè)問(wèn)題

    一篇文章教你用Java使用JVM工具檢測(cè)問(wèn)題

    這篇文章主要介紹了深入理解Java使用JVM工具檢測(cè)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流

    SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流

    這篇文章主要介紹了SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合EasyExcel實(shí)現(xiàn)大規(guī)模數(shù)據(jù)的并行導(dǎo)出與壓縮下載

    SpringBoot整合EasyExcel實(shí)現(xiàn)大規(guī)模數(shù)據(jù)的并行導(dǎo)出與壓縮下載

    在 Spring Boot 應(yīng)用中,整合 EasyExcel 實(shí)現(xiàn)并行導(dǎo)出數(shù)據(jù)并進(jìn)行 Zip 壓縮下載可以極大地提高數(shù)據(jù)處理效率和用戶體驗(yàn),文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-10-10
  • 封裝了一個(gè)Java數(shù)據(jù)庫(kù)訪問(wèn)管理類(lèi)

    封裝了一個(gè)Java數(shù)據(jù)庫(kù)訪問(wèn)管理類(lèi)

    剛剛試著用JDBC,仿著原來(lái)C#的寫(xiě)法寫(xiě)了這段代碼,自己覺(jué)得還是挺粗糙的,還煩請(qǐng)路過(guò)的朋友推薦一個(gè)寫(xiě)得較好較完整的相關(guān)例程以便學(xué)習(xí)。謝謝!
    2009-02-02
  • 使用springboot 打包插件去除jar包瘦身

    使用springboot 打包插件去除jar包瘦身

    這篇文章主要介紹了使用springboot 打包插件去除jar包瘦身的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • springboot整合Atomikos的示例詳解

    springboot整合Atomikos的示例詳解

    這篇文章主要為大家詳細(xì)介紹了幾種分布式事務(wù)的解決方案的兩階段提交Atomikos,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-11-11
  • 解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題

    解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題

    這篇文章主要介紹了解決Feign調(diào)用的GET參數(shù)傳遞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java封裝數(shù)組之添加元素操作實(shí)例分析

    Java封裝數(shù)組之添加元素操作實(shí)例分析

    這篇文章主要介紹了Java封裝數(shù)組之添加元素操作,結(jié)合實(shí)例形式分析了Java封裝數(shù)組實(shí)現(xiàn)元素追加、插入等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • 排序算法圖解之Java插入排序

    排序算法圖解之Java插入排序

    插入排序是一種最簡(jiǎn)單的排序方法,它的基本思想是將一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而一個(gè)新的、記錄數(shù)增1的有序表。本文通過(guò)圖片合示例講解了插入排序的實(shí)現(xiàn),需要的可以了解一下
    2022-11-11

最新評(píng)論

文化| 玉龙| 星子县| 浠水县| 新乐市| 美姑县| 泊头市| 慈利县| 古浪县| 天水市| 灵璧县| 东莞市| 辽宁省| 磴口县| 类乌齐县| 五家渠市| 毕节市| 涡阳县| 永春县| 藁城市| 万安县| 微山县| 浑源县| 射阳县| 夹江县| 八宿县| 四平市| 营山县| 西乌珠穆沁旗| 保山市| 孙吴县| 延川县| 丹凤县| 德令哈市| 延寿县| 杂多县| 琼中| 即墨市| 杂多县| 深圳市| 紫阳县|