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

Java三大最常用集合List、Set、Map用法詳解

 更新時間:2026年02月25日 11:00:28   作者:蘇涵.  
在Java集合框架中,List、Set、Map是最核心的三大接口,它們分別對應線性表、集合、鍵值對映射三種數(shù)據(jù)結構,各自有獨特的設計目標和適用場景,這篇文章主要介紹了Java三大最常用集合List、Set、Map用法的相關資料,需要的朋友可以參考下

前言

List、Set、Map 作為最基礎也最常用的三種集合類型,各自有著鮮明的特性和適用場景。本文梳理清楚它們的區(qū)別、用法和最佳實踐,在開發(fā)中選對集合、少走彎路。

一、集合的本質(zhì)

Java 集合框架的核心目的是存儲、管理和操作一組對象,相比數(shù)組,集合支持動態(tài)擴容、提供豐富的操作方法(增刪改查、排序、篩選等),是處理批量數(shù)據(jù)的首選。

List、Set 屬于集合接口的子接口,而 Map 是獨立的頂級接口(存儲鍵值對),三者的核心差異體現(xiàn)在元素是否有序、是否允許重復上:

集合類型核心特征是否允許重復元素是否有序核心實現(xiàn)類
List有序可重復插入有序(索引有序)ArrayList、LinkedList
Set無序不可重復無序(HashSet)/ 有序(TreeSet)HashSet、TreeSet、LinkedHashSet
Map鍵值對存儲,鍵唯一值可重復、鍵不可無序(HashMap)/ 有序(TreeMap)HashMap、TreeMap、LinkedHashMap

二、特性 + 用法 + 場景

1. List:有序可重復的 “動態(tài)數(shù)組”

List 的核心是有序性(按插入順序保存,可通過索引訪問)和可重復性(允許元素重復),就像我們?nèi)粘S玫?“待辦清單”,可以按順序查看、修改指定位置的內(nèi)容。

import java.util.ArrayList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        // 推薦使用接口聲明,實現(xiàn)類實例化(面向接口編程)
        List<String> fruitList = new ArrayList<>();
        
        // 1. 添加元素
        fruitList.add("蘋果");
        fruitList.add("香蕉");
        fruitList.add("蘋果"); // 允許重復添加
        
        // 2. 按索引訪問元素
        System.out.println("索引1的元素:" + fruitList.get(1)); // 輸出:香蕉
        
        // 3. 修改元素
        fruitList.set(0, "紅蘋果");
        
        // 4. 遍歷元素
        for (String fruit : fruitList) {
            System.out.println(fruit); // 輸出:紅蘋果、香蕉、蘋果
        }
        
        // 5. 刪除元素
        fruitList.remove(2); // 刪除索引2的“蘋果”
    }
}

常用實現(xiàn)類對比:

  • ArrayList:底層是動態(tài)數(shù)組,查詢快(隨機訪問)、增刪慢(需移動元素),適合讀多寫少的場景;
  • LinkedList:底層是雙向鏈表,查詢慢(需遍歷)、增刪快(僅修改節(jié)點引用),適合寫多讀少(如隊列、棧)的場景。

適用場景:

需要按順序存取數(shù)據(jù)、允許重復元素、需通過索引快速訪問的場景(如:訂單列表、用戶留言列表)。

2. Set:無序不可重復的 “無重復集合”

Set 的核心是不可重復性(元素唯一),默認無序(HashSet),就像我們的 “用戶標簽庫”,不允許同一個標簽重復出現(xiàn)。

核心用法示例:

import java.util.HashSet;
import java.util.Set;

public class SetDemo {
    public static void main(String[] args) {
        Set<String> tagSet = new HashSet<>();
        
        // 1. 添加元素
        tagSet.add("Java");
        tagSet.add("Spring");
        tagSet.add("Java"); // 重復元素,添加失敗
        
        // 2. 遍歷元素(無序)
        for (String tag : tagSet) {
            System.out.println(tag); // 輸出:Java、Spring(順序不固定)
        }
        
        // 3. 判斷元素是否存在
        boolean hasJava = tagSet.contains("Java");
        System.out.println("是否包含Java標簽:" + hasJava); // 輸出:true
        
        // 4. 去重場景(核心價值)
        List<String> rawList = List.of("a", "b", "a", "c");
        Set<String> uniqueSet = new HashSet<>(rawList);
        System.out.println("去重后的集合:" + uniqueSet); // 輸出:[a, b, c]
    }
}

常用實現(xiàn)類對比:

  • HashSet:底層基于 HashMap 實現(xiàn),無序、查詢快,依賴元素的hashCode()equals()保證唯一性;
  • LinkedHashSet:繼承 HashSet,底層維護鏈表,保證插入順序,兼具有序和去重;
  • TreeSet:底層基于紅黑樹,可對元素自然排序(或自定義排序),但性能略低于 HashSet。

適用場景:

需要去重、無需按順序存取數(shù)據(jù)的場景(如:用戶標簽、抽獎名單(避免重復中獎)、緩存的唯一鍵集合)。

3. Map:鍵值對存儲的 “字典”

Map 的核心是鍵值對(Key-Value) 存儲,鍵(Key)唯一、值(Value)可重復,就像我們的 “字典”—— 通過唯一的 “單詞(Key)” 找到對應的 “釋義(Value)”。

核心用法示例:

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {
    public static void main(String[] args) {
        Map<Integer, String> userMap = new HashMap<>();
        
        // 1. 添加鍵值對
        userMap.put(1, "張三");
        userMap.put(2, "李四");
        userMap.put(1, "張小三"); // 鍵重復,覆蓋原有值
        
        // 2. 通過鍵獲取值
        String userName = userMap.get(2);
        System.out.println("ID為2的用戶:" + userName); // 輸出:李四
        
        // 3. 遍歷Map(三種方式)
        // 方式1:遍歷所有鍵
        Set<Integer> keys = userMap.keySet();
        for (Integer key : keys) {
            System.out.println("鍵:" + key + ",值:" + userMap.get(key));
        }
        
        // 方式2:遍歷所有鍵值對(推薦,效率高)
        for (Map.Entry<Integer, String> entry : userMap.entrySet()) {
            System.out.println("ID:" + entry.getKey() + ",姓名:" + entry.getValue());
        }
        
        // 方式3:遍歷所有值(不關心鍵時)
        for (String value : userMap.values()) {
            System.out.println("姓名:" + value);
        }
        
        // 4. 判斷鍵是否存在
        boolean hasKey1 = userMap.containsKey(1);
        System.out.println("是否包含鍵1:" + hasKey1); // 輸出:true
    }
}

常用實現(xiàn)類對比:

  • HashMap:底層是哈希表 + 紅黑樹(JDK1.8+),無序、查詢 / 增刪快,線程不安全,是日常開發(fā)首選;
  • LinkedHashMap:繼承 HashMap,維護插入順序,有序且高效;
  • TreeMap:基于紅黑樹,可按鍵排序,適合需要排序的鍵值對場景;
  • Hashtable:線程安全但性能差,已被 ConcurrentHashMap 替代,不推薦使用。

適用場景:

需要通過唯一標識(鍵)快速查找對應數(shù)據(jù)的場景(如:用戶 ID 映射用戶信息、配置項存儲、緩存數(shù)據(jù))。

三、使用集合的核心注意事項

  • Set/Map 的去重依賴hashCode()和equals():如果存儲自定義對象,必須重寫這兩個方法,否則無法保證唯一性;
// 自定義User類示例(重寫hashCode和equals)
class User {
    private Integer id;
    private String name;
    
    // 構造器、getter/setter省略
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id.equals(user.id); // 按ID判斷相等
    }
    
    @Override
    public int hashCode() {
        return id.hashCode(); // 基于ID生成哈希值
    }
}
  • 集合遍歷中修改元素要注意:直接遍歷 List 時用remove()會拋出ConcurrentModificationException,推薦使用迭代器或removeIf()
  • 線程安全問題:ArrayList、HashSet、HashMap 都是線程不安全的,多線程場景需使用CopyOnWriteArrayList、ConcurrentHashMap等線程安全集合;
  • 選擇合適的實現(xiàn)類:優(yōu)先根據(jù) “查詢 / 增刪效率”“是否有序”“是否線程安全” 選擇,而非無腦用 ArrayList/HashMap。

總結 

到此這篇關于Java三大最常用集合List、Set、Map用法的文章就介紹到這了,更多相關Java集合List、Set、Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot集成IJPay實現(xiàn)微信v3支付的示例代碼

    SpringBoot集成IJPay實現(xiàn)微信v3支付的示例代碼

    本文主要介紹了SpringBoot集成IJPay實現(xiàn)微信v3支付的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Java中不用第三個變量來互換兩個變量的值

    Java中不用第三個變量來互換兩個變量的值

    在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應用程序會將這些數(shù)據(jù)保存在一些內(nèi)存單元中,每個內(nèi)存單元都用一個標識符來標識。這些內(nèi)存單元被稱為變量,定義的標識符就是變量名,內(nèi)存單元中存儲的數(shù)據(jù)就是變量的值
    2021-10-10
  • JAVA CyclicBarrier 示例源碼解析

    JAVA CyclicBarrier 示例源碼解析

    CyclicBarrier是一個強大的同步工具,可以幫助我們實現(xiàn)復雜的多線程協(xié)同任務,這篇文章主要介紹了JAVA CyclicBarrier 示例源碼解析,通過本文,我們深入了解了CyclicBarrier的源碼實現(xiàn),并通過一個簡單的示例演示了它的用法,需要的朋友可以參考下
    2023-12-12
  • java網(wǎng)絡之基于UDP的聊天程序示例解析

    java網(wǎng)絡之基于UDP的聊天程序示例解析

    這篇文章主要介紹了java網(wǎng)絡之基于UDP的聊天程序示例解析,文中通過步驟及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • SpringBoot添加SSL證書,開啟HTTPS方式(單向認證服務端)

    SpringBoot添加SSL證書,開啟HTTPS方式(單向認證服務端)

    這篇文章主要介紹了SpringBoot添加SSL證書,開啟HTTPS方式(單向認證服務端),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java Date 轉(zhuǎn) UTC 時間常見方法

    Java Date 轉(zhuǎn) UTC 時間常見方法

    在Java中處理日期時間轉(zhuǎn)換到UTC是一個常見需求,尤其是在全球化應用中,下面我將詳細介紹多種實現(xiàn)方式,并提供一個完整的轉(zhuǎn)換工具示例,感興趣的朋友跟隨小編一起看看吧
    2025-08-08
  • 使用javaMail實現(xiàn)發(fā)送郵件

    使用javaMail實現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細介紹了使用javaMail實現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • SpringBoot實現(xiàn)實時彈幕的示例代碼

    SpringBoot實現(xiàn)實時彈幕的示例代碼

    實時彈幕系統(tǒng)已成為現(xiàn)代視頻網(wǎng)站和直播平臺的標準功能,它讓觀眾可以在觀看視頻時發(fā)送即時評論,本文將介紹如何使用SpringBoot構建一個實時彈幕系統(tǒng),需要的可以了解下
    2025-06-06
  • Spring實戰(zhàn)之清除緩存操作示例

    Spring實戰(zhàn)之清除緩存操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之清除緩存操作,結合實例形式詳細分析了spring清除緩存操作具體步驟、配置、領域模型及相關使用技巧,需要的朋友可以參考下
    2020-01-01
  • 深入理解spring如何管理事務

    深入理解spring如何管理事務

    文章詳細介紹了Spring框架中的事務管理機制,包括事務的基本概念、事務管理的兩種方式、Spring事務管理的整體架構、事務配置、聲明式事務的實現(xiàn)原理、事務的關鍵流程、事務屬性與配置,以及實際開發(fā)中常見的事務問題和解決方案,感興趣的朋友一起看看吧
    2025-01-01

最新評論

泸溪县| 梁平县| 涪陵区| 乌兰浩特市| 长海县| 正镶白旗| 太仓市| 深州市| 新昌县| 大庆市| 扬中市| 西吉县| 称多县| 桐柏县| 长治市| 会理县| 黑河市| 中超| 英吉沙县| 唐河县| 吴旗县| 东宁县| 雅安市| 阿巴嘎旗| 闻喜县| 宜城市| 黄陵县| 长治县| 南京市| 淮阳县| 尚义县| 土默特左旗| 米易县| 紫阳县| 运城市| 敦化市| 义乌市| 宁国市| 安仁县| 花垣县| 新建县|