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

ArrayList和JSONArray邊遍歷邊刪除到底該如何做

 更新時間:2022年12月22日 14:57:19   作者:FeelTouch Labs  
這篇文章主要介紹了ArrayList和JSONArray邊遍歷邊刪除到底該如何做,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

話題看起來有點老生了,但是加入JSONArray還是有很多新意

ArrayList

方式1:索引遍歷

? ? ? ? List<Integer> list = new ArrayList<>();
? ? ? ? list.add(1);
? ? ? ? list.add(2);
? ? ? ? list.add(3456);
? ? ? ? list.add(3456);
? ? ? ? list.add(4);
? ? ? ? for(int i =0; i < list.size(); i++) {
? ? ? ? ? ? if(list.get(i) == 3456) {
? ? ? ? ? ? ? ? list.remove(i);
? ? ? ? ? ? }
? ? ? ? }
? ??
? ? ? ? System.out.println(list);

沒有異常,有輸出結(jié)果[1, 2, 3456, 4],顯然是不對的,沒有把第二個3456刪除掉,問題比較明顯,就是每當(dāng)刪除一個條目底層就會有一次數(shù)據(jù)移動,即被刪除條目下一個索引數(shù)據(jù)占據(jù)了被刪除條目的位置,進入到下一輪遍歷時恰好跳過了原來的下一個條目,就出現(xiàn)了上述的錯誤現(xiàn)象。所以此種遍歷方式是不正確的。

方式2:for each遍歷 

? ? ? ? List<Integer> list = new ArrayList<>();
? ? ? ? list.add(1);
? ? ? ? list.add(2);
? ? ? ? list.add(3456);
? ? ? ? list.add(3456);
? ? ? ? list.add(4);
? ? ? ? /*for(int i =0; i < list.size(); i++) {
? ? ? ? ? ? if(list.get(i) == 3456) {
? ? ? ? ? ? ? ? list.remove(i);
? ? ? ? ? ? }
? ? ? ? }*/
? ? ? ? for(Integer i: list) {
? ? ? ? ? ? if(i == 3456) {
? ? ? ? ? ? ? ? list.remove(i);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println(list);

直接報出異常了:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)

所以此種方式必然不行了。

方式3:迭代器遍歷

? ? ? ? List<Integer> list = new ArrayList<>();
? ? ? ? list.add(1);
? ? ? ? list.add(2);
? ? ? ? list.add(3456);
? ? ? ? list.add(3456);
? ? ? ? list.add(4);
? ? ? ? Iterator<Integer> iterator = list.iterator();
? ? ? ? while (iterator.hasNext()) {
? ? ? ? ? ? if(iterator.next() == 3456) {
? ? ? ? ? ? ? ? iterator.remove();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? System.out.println(list);

運行結(jié)果,完全正確[1, 2, 4]。這也是最推薦的方式。

當(dāng)然,除了第3種方式外,還有2種可以考慮的方式:

方式4. 不刪除,而是new一個新的list的將其中符合條件的添加到新的list,其實就實現(xiàn)了刪除,還是比較穩(wěn)妥的方式。

方式5.再一種就是對方式1的改進,一旦滿足條件執(zhí)行了刪除,就將index--,這樣也是可以實現(xiàn)的,只是很別扭。

JSONArray

首先,通過JSONArray的源代碼看下,其中與ArrayList的關(guān)聯(lián),進入JSONArray類查看remove的代碼:

private final List<Object> list;
? ? public JSONArray() {
? ? ? ? this.list = new ArrayList();
? ? }
? ?
?public boolean remove(Object o) {
? ? ? ? return this.list.remove(o);
? ? }

可以看到,底層就是調(diào)用的ArrayList的remove方法,那么據(jù)此可以推斷方式1,2也會各自存在同樣的問題。

那么方式3是不是就完全ok了?

JSONObject o1 = new JSONObject();
? ? ? ? o1.put("key", 324);
?
? ? ? ? JSONObject o2 = new JSONObject();
? ? ? ? o2.put("key", 325);
?
? ? ? ? JSONObject o3 = new JSONObject();
? ? ? ? o3.put("key", 325);
?
? ? ? ? JSONObject o4 = new JSONObject();
? ? ? ? o4.put("key", 327);
?
? ? ? ? JSONArray ja = ?new JSONArray();
? ? ? ? ja.add(o1);
? ? ? ? ja.add(o2);
? ? ? ? ja.add(o3);
? ? ? ? ja.add(o4);
?
? ? ? ? Iterator<Object> o = ja.iterator();
? ? ? ? while (o.hasNext()) {
? ? ? ? ? ? JSONObject jo = (JSONObject) o.next();
? ? ? ? ? ? if(jo.getIntValue("key") == 325) {
? ? ? ? ? ? ? ? //ja.remove(jo); //不要用這種方式刪除,會報出ConcurrentModificationException
? ? ? ? ? ? ? ? o.remove(); //這種方式OK的
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? System.out.println(ja);

運行結(jié)果[{"key":324},{"key":327}]是完全正確的,只是這里有一點需要注意的是盡管循環(huán)用了iterator,那么刪除的時候也要用迭代器即o.remove()而不是ja.remove(jo),否則還是會有異常的。

此外,對應(yīng)的方式4,5在這里也是適用的,尤其是方式4,也是不錯的方案。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Maven中jar包沖突原理與解決辦法

    Maven中jar包沖突原理與解決辦法

    這篇文章主要介紹了Maven中jar包沖突原理與解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 詳解Spring Boot下使用logback 記錄多個文件日志

    詳解Spring Boot下使用logback 記錄多個文件日志

    這篇文章主要介紹了詳解Spring Boot下使用logback 記錄多個文件日志,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Kotlin中使用Java數(shù)據(jù)類時引發(fā)的Bug解決方式

    Kotlin中使用Java數(shù)據(jù)類時引發(fā)的Bug解決方式

    這篇文章主要介紹了Kotlin中使用Java數(shù)據(jù)類時引發(fā)的一個Bug,本文給大家分享問題解決方式,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • 學(xué)習(xí)JVM之java內(nèi)存區(qū)域與異常

    學(xué)習(xí)JVM之java內(nèi)存區(qū)域與異常

    關(guān)于JVM內(nèi)存區(qū)域的知識對于初學(xué)者來說其實是很重要的,了解Java內(nèi)存分配的原理,這對于以后JAVA的學(xué)習(xí)會有更深刻的理解。下面來看看詳細介紹。
    2016-07-07
  • Spring boot 整合CXF開發(fā)web service示例

    Spring boot 整合CXF開發(fā)web service示例

    這篇文章主要介紹了Spring boot 整合CXF開發(fā)web service示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 自己手寫Mybatis通用batchInsert問題

    自己手寫Mybatis通用batchInsert問題

    這篇文章主要介紹了自己手寫Mybatis通用batchInsert問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 淺析SpringBoot自動裝配的實現(xiàn)

    淺析SpringBoot自動裝配的實現(xiàn)

    springboot開箱即用,其實實現(xiàn)了自動裝配,本文重點給大家介紹SpringBoot是如何做到自動裝配的,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • java啟動jar包修改JVM默認內(nèi)存問題

    java啟動jar包修改JVM默認內(nèi)存問題

    這篇文章主要介紹了java啟動jar包修改JVM默認內(nèi)存問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式

    關(guān)于SpringBoot微服務(wù)發(fā)布與部署的三種方式

    SpringBoot 框架只提供了一套基于可執(zhí)行 jar 包(executable jar)格式的標(biāo)準發(fā)布形式,但并沒有對部署做過多的界定,而且為了簡化可執(zhí)行 jar 包的生成,SpringBoot 提供了相應(yīng)的 Maven 項目插件,需要的朋友可以參考下
    2023-05-05
  • Spring Boot 防止接口惡意刷新和暴力請求的實現(xiàn)

    Spring Boot 防止接口惡意刷新和暴力請求的實現(xiàn)

    本文主要介紹了Spring Boot 防止接口惡意刷新和暴力請求的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評論

阿克陶县| 吕梁市| 兰州市| 阿克陶县| 古浪县| 筠连县| 九台市| 曲靖市| 余江县| 开阳县| 报价| 寿阳县| 新绛县| 凤台县| 莱西市| 宁陵县| 石棉县| 潢川县| 衡阳县| 荥经县| 嵩明县| 涪陵区| 夏津县| 安溪县| 依兰县| 西林县| 绩溪县| 城口县| 昔阳县| 建德市| 彭阳县| 卫辉市| 长乐市| 婺源县| 天门市| 疏附县| 寿宁县| 浦东新区| 蒙阴县| 淅川县| 华坪县|