欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何從List中刪除元素的正確用法舉例

 更新時(shí)間:2023年07月05日 15:08:37   作者:程序員xiaozhang  
這篇文章主要給大家介紹了關(guān)于Java如何從List中刪除元素的正確用法, 列表List是Java中的一種數(shù)據(jù)結(jié)構(gòu),存放按照添加順序的元素,是個(gè)有序的集合,需要的朋友可以參考下

還是先舉個(gè)例子,你侄女對(duì)天文知識(shí)感興趣,然后你就用程序?qū)懥颂栂稻糯笮窍担ㄋ恰⒔鹦?、地球、火星、木星、土星、天王星、海王星、冥王星)的運(yùn)行軌跡圖,然后拿給侄女看。然后她說錯(cuò)了錯(cuò)了,你的知識(shí)太舊了,多了一顆星。根據(jù)2006年8月24日國(guó)際天文聯(lián)合大會(huì)召開,在會(huì)議上經(jīng)過投票表決,冥王星被降級(jí)為矮行星,太陽系目前只剩下八顆行星。所以你需要?jiǎng)h除一顆星。這個(gè)時(shí)候你打開電腦開始刪除冥王星。

你從下面List中刪除一顆星。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"木星","土星","天王星","海王星","冥王星","冥王星");

怎么刪除List中的冥王星呢?[PS為了演示某些刪除方法不可靠,重復(fù)寫了冥王星] 。

先寫一段阿里規(guī)約:

【強(qiáng)制】不要再foreach循環(huán)里進(jìn)行元素的remove/add操作,remove元素請(qǐng)使用Iterator方式,如果并發(fā)的操作,需要對(duì)Iterator對(duì)象加鎖。

好了,那就讓我們來寫所有可能刪除元素的方法

1:普通的for循環(huán)的刪除(不可靠)

List<String> list = new ArrayList(tempList);
         for (int i = 0; i < list.size(); i++) {
            String str = list.get(i);
            if ("冥王星".equals(str)) {
                list.remove(i);
            }
        }
        System.out.println(list);

 運(yùn)行結(jié)果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星,    海王星, 冥王星]

奇了怪了,沒刪除干凈?

問題出在 list.size(),因?yàn)?list.size() 和 i 都是動(dòng)態(tài)變化的,i 的值一直在累加,list.size() 一直在減少,所以 list 就會(huì)早早結(jié)束了循環(huán)。所以這種方式雖然不會(huì)報(bào)錯(cuò),但存在隱患,并且不容易被察覺,不建議使用。

2:普通的for循環(huán)提取變量進(jìn)行刪除(這個(gè)更不可靠,會(huì)報(bào)錯(cuò))

List<String> list = new ArrayList(tempList);
        int size = list.size();
        for (int i = 0; i < size; i++) {
            String result = list.get(i);
            if ("冥王星".equals(result)) {
                list.remove(i);
            }
        }
        System.out.println(list);

結(jié)果如下:

 這更不對(duì)了,一下子搞出個(gè)下標(biāo)越界。

因?yàn)?size 變量是固定的,但 list 的實(shí)際大小是不斷減小的,而 i 的大小是不斷累加的,一旦 i >= list 的實(shí)際大小肯定就異常了。

3:普通的for循環(huán)倒敘刪除(這個(gè)用法可以)

for (int i = list.size() - 1; i > 0; i--) {
            String result = list.get(i);
            if ("冥王星".equals(result)) {
                list.remove(i);
            }
        }
        System.out.println(list);

運(yùn)行結(jié)果如下:

[水星, 金星, 地球, 火星, 木星, 土星, 天王星, 海王星]

4:使用增強(qiáng)的for循環(huán)刪除

會(huì)拋出異常,不推薦,注意我這次為了演示效果,把行星的順序換一下),不少開發(fā)者喜歡用這種方式。

List<String> tempList = Arrays.asList("水星","金星","地球","火星",
"冥王星","土星","天王星","海王星","冥王星","木星");
         List<String> list = new ArrayList(tempList);
        for (String item : list) {
            if ("冥王星".equals(item)) {
                list.remove(item);
            }
        }
        System.out.println(list);

結(jié)果如下:

奇了怪了,又拋異常了。不過這次的異常和上面的下標(biāo)異常不太一樣,這次是:

java.util.ConcurrentModificationException 

這個(gè)是集合操作中很常見的異常之一,即并發(fā)修改異常!

增強(qiáng)的 for循環(huán),其內(nèi)部是調(diào)用的 Iterator 的方法,取下個(gè)元素的時(shí)候都會(huì)去判斷要修改的數(shù)量(modCount)和期待修改的數(shù)量(expectedModCount)是否一致,不一致則會(huì)報(bào)錯(cuò),而 ArrayList 中的 remove 方法并沒有同步期待修改的數(shù)量(expectedModCount)值,所以會(huì)拋異常了。

5、迭代器循環(huán)迭代器刪除

可靠,也是十分推薦的用法)。

Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String item = iterator.next() ;
            if ("冥王星".equals(item)){
                iterator.remove();
            }
        }
        System.out.println(list);

結(jié)果如下,十分完美和正確:

[水星, 金星, 地球, 火星, 土星, 天王星, 海王星, 木星]

這是因?yàn)榈髦械?remove 方法將期待修改的數(shù)量(expectedModCount)值進(jìn)行了同步。

6:迭代器循環(huán)集合刪除

(這個(gè)可能很多開發(fā)者也會(huì)這樣寫,也可能會(huì)拋出異常的)。

Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String item = iterator.next() ;
            if ("冥王星".equals(item)){
                list.remove(item);
            }
        }
        System.out.println(list);

 結(jié)果如下:

7:Stream filter 過濾

(十分推薦,當(dāng)然使用這個(gè)刪除需要JDK的環(huán)境在8及其8以上的版本)。

list = list.stream().filter(item -> !"冥王星".equals(item)).
 collect(Collectors.toList());
 System.out.println(list);

 結(jié)果如下,十分完美和正確:

這個(gè)方法利用了 Stream 的篩選功能,快速過濾所需要的元素,雖然不是進(jìn)行集合刪除,但達(dá)到了同樣的目的,這種方法要更簡(jiǎn)潔

看了上面的幾個(gè)例子,相信你熟悉了List刪除元素的用法了,希望你看了上面的例子,開發(fā)的時(shí)候不會(huì)再犯錯(cuò)了。。。。

總結(jié)

到此這篇關(guān)于Java如何從List中刪除元素的正確用法的文章就介紹到這了,更多相關(guān)Java從List中刪除元素內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java?-jar啟動(dòng)服務(wù)并輸出日志常用命令小結(jié)

    java?-jar啟動(dòng)服務(wù)并輸出日志常用命令小結(jié)

    這篇文章主要介紹了在Linux環(huán)境下運(yùn)行JAR包的幾種方法,包括在命令結(jié)尾添加&使其在后臺(tái)運(yùn)行,使用nohup使程序不掛斷運(yùn)行,以及將日志輸出到指定文件或丟棄,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java Annotation注解相關(guān)原理代碼總結(jié)

    Java Annotation注解相關(guān)原理代碼總結(jié)

    這篇文章主要介紹了Java Annotation注解相關(guān)原理代碼總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Java詳細(xì)講解Math和Random類中有哪些常用方法

    Java詳細(xì)講解Math和Random類中有哪些常用方法

    Math類位于java.lang包中,包含很多用于科學(xué)計(jì)算的類方法,這些方法可以直接通過類名調(diào)用。Random類獲取隨機(jī)數(shù),位于java.util包中,本篇帶你了解它們的常用方法
    2022-05-05
  • SpringBoot超詳細(xì)講解集成Flink的部署與打包方法

    SpringBoot超詳細(xì)講解集成Flink的部署與打包方法

    昨天折騰了下SpringBoot與Flink集成,實(shí)際上集成特簡(jiǎn)單,主要是部署打包的問題折騰了不少時(shí)間。想打出的包直接可以java -jar運(yùn)行,同時(shí)也可以flink run運(yùn)行,或者在flink的dashboard上上傳點(diǎn)擊啟動(dòng)。結(jié)果是不行,但是使用不同的插件打包還是可以的
    2022-05-05
  • 詳解Java編程中對(duì)象的序列化

    詳解Java編程中對(duì)象的序列化

    這篇文章主要介紹了Java編程中對(duì)象的序列化,包括一些反序列化的例子,需要的朋友可以參考下
    2015-11-11
  • 淺析Java中的繼承與組合

    淺析Java中的繼承與組合

    本文將介紹組合和繼承的概念及區(qū)別,并從多方面分析在寫代碼時(shí)如何進(jìn)行選擇。文中通過示例代碼介紹的很詳細(xì),有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Java并發(fā)工具Fork/Join原理

    Java并發(fā)工具Fork/Join原理

    這篇文章主要為大家介紹了Java并發(fā)工具Fork/Join原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • SpringMVC實(shí)現(xiàn)上傳下載文件

    SpringMVC實(shí)現(xiàn)上傳下載文件

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)上傳下載文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • java web中的servlet3 upload上傳文件實(shí)踐

    java web中的servlet3 upload上傳文件實(shí)踐

    這篇文章主要介紹了servlet3 upload上傳文件實(shí)踐,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11

最新評(píng)論