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

資訊專(zhuān)欄INFORMATION COLUMN

Java中ArrayList remove會(huì)遇到的坑

LiangJ / 388人閱讀

摘要:前言平時(shí)最常用的莫過(guò)于和了,面試的時(shí)候也是問(wèn)答的???。先不去管容量負(fù)載因子什么的,就是簡(jiǎn)單的使用也會(huì)遇到坑。元素經(jīng)常遇到的一個(gè)場(chǎng)景是遍歷然后找到合適條件的給刪除掉,比如刪除所有的偶數(shù)。文初的做法不報(bào)錯(cuò),但結(jié)果并不是我們想要的。

前言

平時(shí)最常用的莫過(guò)于ArrayListHashMap了,面試的時(shí)候也是問(wèn)答的???。先不去管容量、負(fù)載因子什么的,就是簡(jiǎn)單的使用也會(huì)遇到坑。

Remove 元素

經(jīng)常遇到的一個(gè)場(chǎng)景是:遍歷list, 然后找到合適條件的給刪除掉,比如刪除所有的偶數(shù)。

@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);
}

看起來(lái)好像沒(méi)問(wèn)題,加入面試的時(shí)候當(dāng)面問(wèn):輸出結(jié)果是什么?再問(wèn)真不會(huì)報(bào)錯(cuò)嗎?再問(wèn)結(jié)果是什么?

報(bào)錯(cuò)

結(jié)果是空l(shuí)ist

結(jié)果是[1, 2, 5]

List.remove()有兩個(gè),一個(gè) public E remove(int index),一個(gè)是public boolean remove(Object o) ,那下面的結(jié)果是什么:
@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]

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

報(bào)錯(cuò): java.lang.UnsupportedOperationException

使用foreach是否可以實(shí)現(xiàn)剛開(kāi)始的問(wèn)題
@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);
    }
}

否,報(bào)錯(cuò)java.util.ConcurrentModificationException

為了性能問(wèn)題,我們推薦把list.size的計(jì)算提取出來(lái)
@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);
    }

}

報(bào)錯(cuò): java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

這是很好的習(xí)慣, 不像開(kāi)頭那樣每次循環(huán)都計(jì)算一次size,而且按這種情況還可以再運(yùn)行的時(shí)候報(bào)錯(cuò)。文初的做法不報(bào)錯(cuò),但結(jié)果并不是我們想要的。

使用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);
}

報(bào)錯(cuò): 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);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67643.html

相關(guān)文章

  • Arrays.asList存在的坑

    摘要:引語(yǔ)阿里巴巴開(kāi)發(fā)規(guī)范說(shuō)到使用工具類(lèi)方法把數(shù)組轉(zhuǎn)換成集合時(shí)不能使用其修改集合相關(guān)的方法它的方法會(huì)拋出我們來(lái)看一下為什么會(huì)出現(xiàn)這種情況問(wèn)題分析我們做個(gè)測(cè)試被注釋的三行可以分別解開(kāi)注釋運(yùn)行后確實(shí)出現(xiàn)了規(guī)約中所說(shuō)的異常我們來(lái)看下做了什么操作看上去是 引語(yǔ): 阿里巴巴java開(kāi)發(fā)規(guī)范說(shuō)到使用工具類(lèi)Arrays.asList()方法把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,它的add/re...

    Pandaaa 評(píng)論0 收藏0
  • Java開(kāi)發(fā) 大廠面試整理

    摘要:用戶(hù)態(tài)不能干擾內(nèi)核態(tài)所以指令就有兩種特權(quán)指令和非特權(quán)指令不同的狀態(tài)對(duì)應(yīng)不同的指令。非特權(quán)指令所有程序均可直接使用。用戶(hù)態(tài)常態(tài)目態(tài)執(zhí)行非特權(quán)指令。 這是我今年從三月份開(kāi)始,主要的大廠面試經(jīng)過(guò),有些企業(yè)面試的還沒(méi)來(lái)得及整理,可能有些沒(méi)有帶答案就發(fā)出來(lái)了,還請(qǐng)各位先思考如果是你怎么回答面試官?這篇文章會(huì)持續(xù)更新,請(qǐng)各位持續(xù)關(guān)注,希望對(duì)你有所幫助! 面試清單 平安產(chǎn)險(xiǎn) 飛豬 上汽大通 浩鯨科...

    Scorpion 評(píng)論0 收藏0
  • java常見(jiàn)十大誤區(qū)

    摘要:根據(jù)拇指規(guī)則,最佳做法應(yīng)該是盡量減少屬性的訪問(wèn)級(jí)別。通常的,可變對(duì)象可用來(lái)避免產(chǎn)生過(guò)多的對(duì)象。如果類(lèi)中定義了構(gòu)造函數(shù),那么編譯器將不會(huì)給它插入默認(rèn)構(gòu)造函數(shù)。 1、轉(zhuǎn)化數(shù)組為ArrayList 通常開(kāi)發(fā)者轉(zhuǎn)化數(shù)組為ArrayList的方式為 List list = Arrays.asList(arr); Arrays.asList()會(huì)返回一個(gè)ArrayList,而這個(gè)ArrayList...

    yintaolaowanzi 評(píng)論0 收藏0
  • 常見(jiàn)的集合容器應(yīng)當(dāng)避免的坑

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

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

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

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

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

0條評(píng)論

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