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

Java從List中刪除元素的幾種方式小結(jié)

 更新時(shí)間:2024年08月21日 08:58:30   作者:IT后浪1024  
在Java中,List 接口提供了一個(gè) remove(Object o) 方法來(lái)移除列表中與給定對(duì)象相等的第一個(gè)元素,然而,直接使用這個(gè)方法來(lái)刪除列表中的元素有時(shí)并不是最優(yōu)的選擇,主要原因包括效率和同步性問(wèn)題,本文介紹了Java從List中刪除元素的幾種方式,需要的朋友可以參考下

效率問(wèn)題:

  • 線性搜索remove(Object o) 方法需要遍歷列表直到找到與給定對(duì)象相等的第一個(gè)元素,這涉及到線性搜索,對(duì)于長(zhǎng)度為 n 的列表,最壞情況下的時(shí)間復(fù)雜度為 O(n)。
  • 移動(dòng)元素:一旦找到目標(biāo)元素,remove() 還需要將所有后續(xù)元素向前移動(dòng)一位以填補(bǔ)空缺。這同樣需要 O(n) 的時(shí)間復(fù)雜度。因此,整個(gè)操作的時(shí)間復(fù)雜度為 O(n)。

同步性問(wèn)題:

如果在迭代列表的同時(shí)使用 remove(),可能會(huì)導(dǎo)致迭代器失效或跳過(guò)元素,因?yàn)閯h除操作改變了列表的大小,索引值對(duì)應(yīng)的數(shù)據(jù)也發(fā)生了變化。這可能導(dǎo)致未定義的行為或錯(cuò)誤的結(jié)果。

普通替代方案:

使用迭代器刪除元素

使用迭代器的 remove() 方法:當(dāng)遍歷列表并刪除元素時(shí),建議使用迭代器的 remove() 方法。這種方法可以避免迭代器失效的問(wèn)題,并且通常更安全

import java.util.Iterator;
import java.util.List;
import java.util.LinkedList;
?
public class ListDeletion {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
?
        // 使用迭代器刪除元素
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("banana".equals(element)) {
                iterator.remove();  // 安全地刪除元素
            }
        }
?
        System.out.println(list);  // 輸出: [apple, cherry]
    }
}

臨時(shí)列表存儲(chǔ)刪除的元素

使用list.removeAll方法: 當(dāng)你在遍歷列表的同時(shí)刪除元素時(shí),很容易觸發(fā) ConcurrentModificationException。使用臨時(shí)列表可以避免這個(gè)問(wèn)題,因?yàn)槟闶窃诒闅v結(jié)束后才進(jìn)行刪除操作。同時(shí)可以使代碼更加清晰易讀,你可以在一次遍歷中專注于識(shí)別要?jiǎng)h除的元素,并在另一次操作中執(zhí)行刪除操作。

import java.util.ArrayList;
import java.util.List;
?
public class ListDeletionTemporary {
?
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");
?
        List<String> itemsToRemove = new ArrayList<>();
        for (String item : list) {
            if ("banana".equals(item)) {
                itemsToRemove.add(item);
            }
        }
?
        list.removeAll(itemsToRemove);
        System.out.println(list);  // 輸出: [apple, cherry]
    }
}

使用Stream流進(jìn)行過(guò)濾

使用stream().filter方法過(guò)濾: Java 8 引入了 Stream API,可以使用filter方法來(lái)創(chuàng)建一個(gè)新的列表,只包含那些不需要?jiǎng)h除的元素。這種方式簡(jiǎn)潔且避免了并發(fā)修改的問(wèn)題,但是它會(huì)創(chuàng)建一個(gè)新列表,占用額外的內(nèi)存。

public class ListDeletionStream {
?
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "cherry"));
?
        List<String> filteredList = list.stream()
                .filter(s -> !"banana".equals(s))
                .collect(Collectors.toList());
?
        System.out.println(filteredList);  // 輸出: [apple, cherry]
    }
}

使用List的removeIf方法

使用 removeIf(Predicate<? super E> filter) 方法:從 Java 8 開(kāi)始,List 接口提供了一個(gè) removeIf(Predicate<? super E> filter) 方法,允許你根據(jù)提供的謂詞刪除元素。這是一種簡(jiǎn)潔且高效的刪除方式。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
?
public class ListDeletionRemoveIf {
?
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("apple", "banana", "cherry"));
        list.removeIf(s -> s.equals("banana")); // 刪除等于 "banana" 的所有元素
?
        System.out.println(list);
    }
}

并發(fā)安全方案:

避免遍歷和刪除同時(shí)進(jìn)行

使用ListIterator可以避免并發(fā)修改異常,如果你想從List中刪除元素,并且希望在遍歷過(guò)程中能夠安全地移除元素而不引發(fā)ConcurrentModificationException異常,你應(yīng)該使用ListIterator。這是因?yàn)?code>ListIterator提供了額外的方法來(lái)修改列表(如remove()),這些方法與迭代器的內(nèi)部狀態(tài)同步,可以避免并發(fā)修改的問(wèn)題。

import java.util.LinkedList;
import java.util.ListIterator;
?
public class ListDeletionListIterator {
?
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)LinkedList并添加一些元素
        LinkedList<String> list = new LinkedList<>();
        list.add("One");
        list.add("Two");
        list.add("Three");
        list.add("Four");
        list.add("Five");
?
        System.out.println("Original list: " + list);
?
        // 獲取ListIterator
        ListIterator<String> iterator = list.listIterator();
?
        // 移動(dòng)到第一個(gè)元素
        if (iterator.hasNext()) {
            iterator.next();  // 移動(dòng)到"One"
        }
?
        // 刪除特定元素
        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("Three".equals(element)) {  // 刪除"Three"
                iterator.remove();
            } else if ("Four".equals(element)) {  // 刪除"Four"
                iterator.remove();
            }
        }
?
        System.out.println("Modified list: " + list);
    }
}

利用多線程/并行處理

如果列表非常大,可以考慮使用并行流(parallel stream)來(lái)并行處理刪除操作。一種常見(jiàn)的做法是使用過(guò)濾(filtering)來(lái)生成一個(gè)新的列表,而不是直接修改原始列表。這種方法不會(huì)修改原始列表,而是返回一個(gè)新的不包含指定元素的列表。不過(guò)需要注意的是,并非所有情況并行處理都能帶來(lái)性能提升,它依賴于數(shù)據(jù)量和硬件配置。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
?
public class ListDeletionParallelStream {
?
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)ArrayList并添加一些元素
        ArrayList<String> originalList = new ArrayList<>();
        originalList.add("One");
        originalList.add("Two");
        originalList.add("Three");
        originalList.add("Four");
        originalList.add("Five");
?
        System.out.println("Original list: " + originalList);
?
        // 使用并行流過(guò)濾出需要保留的元素
        List<String> filteredList = originalList.parallelStream()
                .filter(item -> !"Three".equals(item) && !"Four".equals(item))
                .collect(Collectors.toList());
?
        System.out.println("Filtered list: " + filteredList);
    }
}

其它方案思考:

數(shù)據(jù)結(jié)構(gòu)的選擇

如果你的應(yīng)用中刪除操作頻繁,考慮使用LinkedList,因?yàn)樗膭h除操作時(shí)間復(fù)雜度為O(1),而ArrayList的刪除操作平均時(shí)間復(fù)雜度為O(n)。

使用BitSet標(biāo)記刪除元素

對(duì)于非常大的列表,可以使用BitSet來(lái)標(biāo)記哪些元素需要被刪除。然后,再根據(jù)標(biāo)記進(jìn)行刪除。這種方法可以減少不必要的遍歷,但會(huì)增加額外的空間開(kāi)銷。

考慮使用集合框架中的其他集合類型

如果你的需求是動(dòng)態(tài)的,可能需要在運(yùn)行時(shí)調(diào)整集合的大小和結(jié)構(gòu),考慮使用如TreeSetLinkedHashSet等其他類型的集合,它們提供了不同的性能特征和保證。

在實(shí)際應(yīng)用中,選擇最合適的策略應(yīng)該基于對(duì)數(shù)據(jù)特性的了解、操作頻率、資源限制以及性能要求。每種方法都有其適用的場(chǎng)景和局限性,因此需要根據(jù)具體情況進(jìn)行權(quán)衡。

以上就是Java從List中刪除元素的幾種方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Java從List中刪除元素的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JFinal極速開(kāi)發(fā)框架使用筆記分享

    JFinal極速開(kāi)發(fā)框架使用筆記分享

    下面小編就為大家分享一篇JFinal極速開(kāi)發(fā)框架使用筆記,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • java實(shí)現(xiàn)計(jì)算周期性提醒的示例

    java實(shí)現(xiàn)計(jì)算周期性提醒的示例

    本文分享一個(gè)java實(shí)現(xiàn)計(jì)算周期性提醒的示例,可以計(jì)算父親節(jié)、母親節(jié)這樣的節(jié)日,也可以定義如每月最好一個(gè)周五,以方便安排會(huì)議
    2014-04-04
  • Java注解(Annotations)的定義和使用詳解

    Java注解(Annotations)的定義和使用詳解

    Java注解(Annotations)是Java5引入的一種元數(shù)據(jù)(Metadata),它提供了一種在源代碼中嵌入補(bǔ)充信息的方式,這些信息可以被編譯器、JVM或其他工具在編譯時(shí)、運(yùn)行時(shí)進(jìn)行處理,注解本身不會(huì)直接影響程序的執(zhí)行,但可以用來(lái)指導(dǎo)編譯器、JVM或其他工具的行為,從而實(shí)現(xiàn)各種功能
    2025-03-03
  • spring?retry方法調(diào)用失敗重試機(jī)制示例解析

    spring?retry方法調(diào)用失敗重試機(jī)制示例解析

    這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機(jī)制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • SpringBoot啟動(dòng)時(shí)如何通過(guò)啟動(dòng)參數(shù)指定logback的位置

    SpringBoot啟動(dòng)時(shí)如何通過(guò)啟動(dòng)參數(shù)指定logback的位置

    這篇文章主要介紹了SpringBoot啟動(dòng)時(shí)如何通過(guò)啟動(dòng)參數(shù)指定logback的位置,在spring boot中,使用logback配置的方式常用的有兩種,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法

    Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法

    平時(shí)對(duì)接口時(shí),經(jīng)常遇到j(luò)son字符串和map對(duì)象之間的交互,這篇文章主要給大家介紹了關(guān)于Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Java內(nèi)部類之間的閉包和回調(diào)詳解

    Java內(nèi)部類之間的閉包和回調(diào)詳解

    相信閉包和回調(diào)對(duì)每位學(xué)習(xí)Java的人來(lái)說(shuō)都不陌生,那么今天小編和大家分享一篇關(guān)于Java內(nèi)部類之間的閉包和回調(diào),有需要的可以參考借鑒。
    2016-09-09
  • kafka安裝部署超詳細(xì)步驟

    kafka安裝部署超詳細(xì)步驟

    這篇文章主要介紹了kafka安裝部署的詳細(xì)步驟,主要應(yīng)用場(chǎng)景是:日志收集系統(tǒng)和消息系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Jenkins環(huán)境搭建之下載與安裝過(guò)程

    Jenkins環(huán)境搭建之下載與安裝過(guò)程

    Jenkins是一個(gè)功能強(qiáng)大的應(yīng)用程序,允許持續(xù)集成和持續(xù)交付項(xiàng)目,集成Jenkins可以用于一些測(cè)試和部署技術(shù),對(duì)Jenkins環(huán)境搭建之下載與安裝過(guò)程感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • 劍指Offer之Java算法習(xí)題精講數(shù)組查找與字符串交集

    劍指Offer之Java算法習(xí)題精講數(shù)組查找與字符串交集

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03

最新評(píng)論

桦南县| 大关县| 镇巴县| 闸北区| 苗栗县| 永春县| 太湖县| 广汉市| 苍南县| 灌云县| 赫章县| 修武县| 左云县| 信丰县| 秭归县| 华安县| 唐海县| 太仓市| 鲁甸县| 青浦区| 乌鲁木齐市| 临沧市| 开远市| 明星| 克什克腾旗| 辉县市| 贺兰县| 东乌珠穆沁旗| 遂溪县| 德兴市| 凤城市| 贡山| 扎兰屯市| 武城县| 垣曲县| 婺源县| 陆河县| 治多县| 新竹市| 家居| 重庆市|