国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java中ArrayList remove會遇到的坑

LiangJ / 363人閱讀

摘要:前言平時最常用的莫過于和了,面試的時候也是問答的常客。先不去管容量負載因子什么的,就是簡單的使用也會遇到坑。元素經常遇到的一個場景是遍歷然后找到合適條件的給刪除掉,比如刪除所有的偶數。文初的做法不報錯,但結果并不是我們想要的。

前言

平時最常用的莫過于ArrayListHashMap了,面試的時候也是問答的常客。先不去管容量、負載因子什么的,就是簡單的使用也會遇到坑。

Remove 元素

經常遇到的一個場景是:遍歷list, 然后找到合適條件的給刪除掉,比如刪除所有的偶數。

@Test
public void testRemove2(){
    List integers = new ArrayList<>(5);
    integers.add(1);
    integers.add(2);
    integers.add(2);
    integers.add(4);
    integers.add(5);

    for (int i = 0; i < integers.size(); i++) {
        if (integers.get(i)%2==0){
            integers.remove(i);
        }
    }

    System.out.println(integers);
}

看起來好像沒問題,加入面試的時候當面問:輸出結果是什么?再問真不會報錯嗎?再問結果是什么?

報錯

結果是空list

結果是[1, 2, 5]

List.remove()有兩個,一個 public E remove(int index),一個是public boolean remove(Object o) ,那下面的結果是什么:
@Test
public void testRemove(){
    ArrayList integers = Lists.newArrayList(1, 2, 3, 4);
    System.out.println(integers);
    integers.remove(1);
    System.out.println(integers);
}

[1, 3, 4]

經常會使用一個Arrays.asList的API, 那么下面的結果是什么:
@Test
public void testRemove3(){
    List list = Arrays.asList("a","b");
    list.add("c");
    System.out.println(list);
}

報錯: java.lang.UnsupportedOperationException

使用foreach是否可以實現剛開始的問題
@Test
public void testRemove4(){
    List strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    for (String string : strings) {
        strings.remove(string);
    }
}

否,報錯java.util.ConcurrentModificationException

為了性能問題,我們推薦把list.size的計算提取出來
@Test
public void testRemove5(){
    List strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    int size = strings.size();
    for (int i = 0; i < size; i++) {
        strings.remove(i);
    }

}

報錯: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

這是很好的習慣, 不像開頭那樣每次循環都計算一次size,而且按這種情況還可以再運行的時候報錯。文初的做法不報錯,但結果并不是我們想要的。

使用Iterator是不是就可以remove了
@Test
public void testRemove6(){
    List strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    Iterator iterator = strings.iterator();
    while (iterator.hasNext()){
        String next = iterator.next();
        strings.remove(next);
    }

    System.out.println(strings);
}

報錯: java.util.ConcurrentModificationException

正確的remove做法是什么
@Test
public void testRemove7(){
    List strings = new ArrayList<>();
    strings.add("a");
    strings.add("b");
    strings.add("c");
    strings.add("d");

    Iterator iterator = strings.iterator();
    while (iterator.hasNext()){
        String next = iterator.next();
        iterator.remove();
    }

    System.out.println(strings);
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67643.html

相關文章

  • Arrays.asList存在的坑

    摘要:引語阿里巴巴開發規范說到使用工具類方法把數組轉換成集合時不能使用其修改集合相關的方法它的方法會拋出我們來看一下為什么會出現這種情況問題分析我們做個測試被注釋的三行可以分別解開注釋運行后確實出現了規約中所說的異常我們來看下做了什么操作看上去是 引語: 阿里巴巴java開發規范說到使用工具類Arrays.asList()方法把數組轉換成集合時,不能使用其修改集合相關的方法,它的add/re...

    Pandaaa 評論0 收藏0
  • Java開發 大廠面試整理

    摘要:用戶態不能干擾內核態所以指令就有兩種特權指令和非特權指令不同的狀態對應不同的指令。非特權指令所有程序均可直接使用。用戶態常態目態執行非特權指令。 這是我今年從三月份開始,主要的大廠面試經過,有些企業面試的還沒來得及整理,可能有些沒有帶答案就發出來了,還請各位先思考如果是你怎么回答面試官?這篇文章會持續更新,請各位持續關注,希望對你有所幫助! 面試清單 平安產險 飛豬 上汽大通 浩鯨科...

    Scorpion 評論0 收藏0
  • java常見十大誤區

    摘要:根據拇指規則,最佳做法應該是盡量減少屬性的訪問級別。通常的,可變對象可用來避免產生過多的對象。如果類中定義了構造函數,那么編譯器將不會給它插入默認構造函數。 1、轉化數組為ArrayList 通常開發者轉化數組為ArrayList的方式為 List list = Arrays.asList(arr); Arrays.asList()會返回一個ArrayList,而這個ArrayList...

    yintaolaowanzi 評論0 收藏0
  • 常見的集合容器應當避免的坑

    摘要:盡可能避免使用,會導致復制數組,降低效率。再額外提一點,我們常用的另一個容器也是推薦要初始化長度從而避免擴容。 showImg(https://segmentfault.com/img/remote/1460000019659723); 前言 前不久幫同事一起 review 一個 job 執行緩慢的問題時發現不少朋友在擼碼實現功能時還是有需要細節不夠注意,于是便有了這篇文章。 Arra...

    GraphQuery 評論0 收藏0
  • Java筆記-容器源碼(持續更新)

    摘要:加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行操作即重建內部數據結構,從而哈希表將具有大約兩倍的桶數。成員變量每個對由封裝,存在了對象數組中。 雖是讀書筆記,但是如轉載請注明出處 http://segmentfault.com/blog/exploring/ .. 拒絕伸手復制黨 LinkedLis...

    mrli2016 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<