集合,完整擴展

目錄

前言:

一、List接口

1.1 ArrayList

1.2 LinkedList

1.3 Vector

二、Set接口

2.1 HashSet

2.2 TreeSet

2.3 LinkedHashSet

三、應用選擇


前言:

本篇文章重點梳理 List 接口和 Set 接口的核心內容,結合代碼案例幫大家吃透它們的特點和用法。

先簡單復習下 Collection 接口:它是所有單列集合的 “老祖宗”,定義了添加、刪除、判斷包含等通用方法,像add()、remove()、contains()這些,咱們后面講的 List 和 Set 都能直接用。

一、List接口

------有序、可重復、帶索引的 “排隊隊伍”

List 接口繼承了 Collection,就像在 Collection 的基礎上多了些 “特殊技能”。咱們記住它的三個核心特點:

--有序:元素怎么存進去,取出來還是這個順序,比如存[1,2,3],取出來不會變成[3,1,2];
--帶索引:可以通過下標(0、1、2...)直接訪問元素,就像數組那樣用get(index)拿值;
--可重復:同一個元素能存多次,比如list.add("a"); list.add("a");會有兩個 "a"。

List接口有三種實現類:ArrayList、LinkedList、Vector。

1.1 ArrayList

------查詢快、增刪慢的 “數組加強版”

ArrayList 是 List 最常用的實現類,底層就是個動態數組(長度能自動變)

  • 優點:查詢快!因為數組在內存中連續存儲,通過索引直接定位,時間復雜度 O (1);
  • 缺點:增刪慢!如果在中間插元素,后面的元素都得往后挪,比如數組[1,2,3]插個 4 到中間,就變成[1,4,2,3],2 和 3 都要移動。

代碼案例:

List<String> list = new ArrayList<>();
list.add("蘋果");  // 末尾加元素
list.add(1, "香蕉");  // 下標1的位置插入
System.out.println(list.get(0));  // 用索引查元素,輸出“蘋果”
list.remove(1);  // 刪除下標1的元素

1.2 LinkedList

------增刪快、查詢慢的 “鏈表”

LinkedList 底層是雙向鏈表,每個元素像個 “小火車車廂”,除了存數據,還帶著前后 “鉤子”(指針)

  • 優點:增刪快!中間插元素只需改前后指針,不用移動其他元素,比如鏈表1->2->3插個 4,改成1->4->2->3就行;
  • 缺點:查詢慢!找第 n 個元素得從第一個開始挨個往后數,時間復雜度 O (n)。

代碼案例:

LinkedList<String> list = new LinkedList<>();
list.addFirst("頭");  // 頭部加元素
list.addLast("尾");   // 尾部加元素
System.out.println(list.getFirst());  // 取頭部元素
list.removeLast();    // 刪除尾部元素

1.3 Vector

------線程安全的 “老古董”

Vector 和 ArrayList 類似,也是動態數組,但它的方法大多加了synchronized(同步鎖),多線程環境下用著安全。不過單線程下性能不如 ArrayList,現在基本被Collections.synchronizedList(new ArrayList<>())替代了。

二、Set接口

------無序、不可重復的 “聚寶盆”

Set 接口也是 Collection 的 “孩子”,但和 List 性格完全不同:

--無序:存的順序和取的順序沒關系(LinkedHashSet 除外);
--無索引:不能用下標訪問,只能遍歷;
--不可重復:相同元素只能存一次,比如set.add("a"); set.add("a");最終只有一個 "a"。

2.1 HashSet

------用哈希表實現的 “去重小能手”

HashSet 底層是哈希表,判斷元素是否重復靠兩個方法:hashCode()equals()

--存元素時,先算元素的哈希值(hashCode()),找對應的 “坑位”;
--如果 “坑位” 已有元素,再用equals()比較,相同就不存,不同就 “掛” 在后面(哈希沖突處理)。

代碼案例:

Set<String> set = new HashSet<>();
set.add("張三");
set.add("張三");  // 重復,添加失敗
set.add(null);
set.add(null);    // 重復,只存一個null
System.out.println(set.size());  // 輸出2("張三"和null)

注意:

存自定義對象(比如 Student)時,必須重寫hashCode()和equals(),否則去重失效!

2.2 TreeSet

------自動排序的 “整理小助手”

TreeSet 底層是紅黑樹(一種排序樹),元素會自動按規則排好序。

排序規則有兩種:

--自然排序:元素類實現Comparable接口,重寫compareTo()方法;
--比較器排序:創建 TreeSet 時傳Comparator對象,自定義排序邏輯。

代碼案例:

????????--自然排序

// Student類實現Comparable接口
class Student implements Comparable<Student> {String name;int age;@Overridepublic int compareTo(Student o) {return this.age - o.age;  // 按年齡升序}
}Set<Student> set = new TreeSet<>();
set.add(new Student("張三", 20));
set.add(new Student("李四", 18));
// 遍歷會輸出:李四(18)、張三(20)(按年齡排好了)

2.3 LinkedHashSet

------有序的 “HashSet 升級版”

LinkedHashSet 是 HashSet 的子類,底層多了個鏈表記錄插入順序,所以既能去重,又能保證 “存啥順序,取啥順序”。性能比 HashSet 稍差,但在需要順序的時候很有用。

代碼案例:

Set<String> set = new LinkedHashSet<>();
set.add("b");
set.add("a");
set.add("c");
// 遍歷輸出:b、a、c(和插入順序一致)

三、應用選擇

有序用 List,去重用 Set;查多用 ArrayList,增刪多用 LinkedList;需要排序用 TreeSet,要順序去重用 LinkedHashSet

總結:

集合特點場景舉例
ArrayList查快增刪慢、有序重復存班級名單,頻繁查詢
LinkedList增刪快查慢、有序重復實現隊列 / 棧,頻繁加減元素
HashSet無序去重、效率高存用戶 ID,需要去重
TreeSet自動排序、去重存成績,需要按分數排序
LinkedHashSet有序去重存操作日志,保留順序

好了,我們今天的內容就到這里了,感謝大家的觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92773.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【doris基礎與進階】3-Doris安裝與部署

安裝前的準備 在windows系統上通過vmwareubuntu 22.04的方式進行安裝&#xff0c;由于資源有限&#xff0c;在同1臺機器上同時安裝fe和be&#xff08;broker本次不安裝&#xff0c;極簡化安裝&#xff09;&#xff0c;安裝版本為2.1.10&#xff0c;2.x版本架構不會有大的變化&a…

關于數據結構6-哈希表和5種排序算法

哈希表1哈希算法將數據通過哈希算法映射成一個鍵值&#xff0c;存取都在同一個位置實現數據的高效存儲和查找&#xff0c;將時間復雜度盡可能降低至O(1)2哈希碰撞多個數據通過哈希算法得到的鍵值相同&#xff0c;成為產生哈希碰撞3哈希表&#xff1a;構建哈希表存放0-100之間的…

AWT與Swing深度對比:架構差異、遷移實戰與性能優化

全面對比分析Java AWT與Swing GUI框架的架構差異、性能表現和適用場景&#xff0c;提供完整的AWT到Swing遷移實戰指南&#xff0c;包含15代碼示例、性能測試數據、最佳實踐建議&#xff0c;助你做出明智的技術選型和實現平滑遷移。 Java AWT, Swing, GUI框架對比, 代碼遷移, 性…

git倉庫檢測工具

介紹 Gitleaks 是一款用于檢測git 倉庫、文件以及任何你想通過 git 傳遞的信息(例如密碼、API 密鑰和令牌)的工具stdin。如果你想了解更多關于檢測引擎工作原理的信息,請查看這篇博客:正則表達式(幾乎)就是你所需要的一切。 ? ~/code(master) gitleaks git -v○│╲│…

【4】Transformers快速入門:自然語言模型 vs 統計語言模型

一句話關系總結 統計語言模型 自然語言模型的“數學基礎” &#xff08;就像加減乘除是數學的基礎&#xff0c;統計模型是AI學說話的基礎工具&#xff09;區別對比表&#xff08;小白版&#xff09;維度統計語言模型自然語言模型本質用數學公式算句子概率用神經網絡模仿人腦理…

[激光原理與應用-252]:理論 - 幾何光學 - 傳統透鏡焦距固定,但近年出現的可變形透鏡(如液態透鏡、彈性膜透鏡)可通過改變自身形狀動態調整焦距。

一、液態透鏡&#xff1a;電潤濕效應驅動曲率變化基本結構液態透鏡由兩種互不相溶的液體&#xff08;如導電水溶液與絕緣硅油&#xff09;封裝在透明圓筒形容器中構成。容器壁經疏水處理&#xff0c;使水溶液呈圓頂型聚集在中心&#xff0c;與硅油形成凸狀曲面。工作原理電潤濕…

wordpress數據庫導入時的#1044錯誤

在wordpress網站數據庫文件.sql導入到數據庫時&#xff0c;發生錯誤&#xff0c;錯誤提示如下&#xff1a;#1044 – Access denied for user ‘wodepress_com’’localhost’ to database ‘wodepress’。 這個錯誤表明用戶wodepress_com沒有權限訪問數據庫wodepress。以下是解…

微服務ETCD服務注冊和發現

1.什么是注冊中心 注冊中心主要有三種角色&#xff1a; 服務提供者&#xff08;RPC Server&#xff09;&#xff1a;在啟動時&#xff0c;向 Registry 注冊自身服務&#xff0c;并向 Registry 定期發送心跳匯報存活狀態。 服務消費者&#xff08;RPC Client&#xff09;&…

計算機網絡---默認網關(Default Gateway)

一、默認網關的定義 默認網關&#xff08;Default Gateway&#xff09;是一個網絡設備&#xff08;通常是路由器、防火墻或三層交換機&#xff09;的IP地址&#xff0c;它是本地網絡中的設備訪問其他網絡&#xff08;如外網、其他子網&#xff09;時&#xff0c;數據報文的“第…

OpenBMC中libgpio架構與驅動交互全解析:從硬件映射到應用控制

1. libgpio概述與核心定位 libgpio作為OpenBMC中GPIO管理的核心庫&#xff0c;扮演著連接硬件驅動與上層應用的橋梁角色。它通過標準化的接口抽象了不同硬件平臺的GPIO操作細節&#xff0c;使得電源控制、傳感器監控等關鍵功能能夠以統一的方式訪問GPIO資源。 1.1 libgpio在Ope…

開放原子開源生態大會:麒麟信安加入openEuler社區AI聯合工作組,聚焦操作系統開源實踐與行業賦能

7月23日&#xff0c;由開放原子開源基金會主辦的2025開放原子開源生態大會在京開幕&#xff0c;大會以“開源賦能產業&#xff0c;生態共筑未來”為主題。工業和信息化部副部長熊繼軍、北京市人民政府副秘書長許心超出席大會并致辭。作為開放原子開源基金會黃金捐贈人和開源重要…

Lyapunov與SAC算法的數學結構對比:從二次漂移到TD損失

一、李雅普諾夫優化中二次漂移函數的推導 李雅普諾夫優化的核心是通過設計 “李雅普諾夫函數” 和 “漂移項”&#xff0c;保證系統狀態收斂到穩定點。以下以線性時不變系統為例&#xff08;非線性系統推導邏輯類似&#xff0c;僅動力學方程更復雜&#xff09;&#xff0c;推導…

WireShark:非常好用的網絡抓包工具

文章目錄一、寫在前面二、安裝三、使用1、入門使用&#xff08;1&#xff09;打開軟件&#xff08;2&#xff09;右鍵網卡&#xff0c;Start Capture(開始捕獲)2、界面詳細介紹3、過濾器設置一、寫在前面 Wireshark是使用最廣泛的一款「開源抓包軟件」&#xff0c;常用來檢測網…

WEB技術演進史:從C/S到微服務架構

WEB技術 HTTP協議和B/S 結構 操作系統有進程子系統&#xff0c;使用多進程就可以充分利用硬件資源。進程中可以多個線程&#xff0c;每一個線程可以被CPU調度執行&#xff0c;這樣就可以讓程序并行的執行。這樣一臺主機就可以作為一個服務器為多個客戶端提供計算服務。 客戶端…

win11中Qt5.14.0+msvc2019+opencv4.9配置

本文主要研究由msvc編譯的opencv在QT中的配置&#xff0c;opencv可以是官網直接下載的版本&#xff0c;也可以是msvc(例如vs2019)通過cmake編譯 contrib功能的opencv版本&#xff0c;這2種版本對qt版本沒有嚴格要求&#xff0c;但是若在cmake中選擇了with_qt功能&#xff0c;那…

【listlist模擬】

list&list模擬1.list使用2、list模擬附錄1.list使用 list常見接口不做介紹&#xff0c;跟前面vector有相似之處&#xff0c;跟數據結構list基本一樣。 ?因為list使用帶頭的雙向循環鏈表實現的&#xff0c;不能用小標訪問&#xff0c;只能用迭代器或范圍for訪問 list有成…

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄

在CentOS 7上將PostgreSQL數據庫從默認路徑遷移到自定義目錄&#xff0c;需遵循以下步驟。假設原數據目錄為“/var/lib/pgsql/12/data”&#xff0c;目標目錄為“/new/path/pgdata”。 1、步驟概覽 停止PostgreSQL服務創建新目錄并設置權限復制數據文件&#xff08;保留權限&am…

C語言基礎06——結構體(struct)

一、結構體的概念結構體&#xff08;struct&#xff09;是 C 語言中一種自定義數據類型&#xff0c;它允許你將不同類型的數據項組合在一起&#xff0c;形成一個新的復合數據類型。想象一下&#xff1a;如果要表示一個 "學生"&#xff0c;需要包含姓名&#xff08;字…

小白入門指南:Edge SCDN 輕松上手

在互聯網飛速發展的當下&#xff0c;網站性能與安全至關重要。對于小白而言&#xff0c;Edge SCDN 可能是個陌生概念&#xff0c;但它卻能極大助力網站運營。本文將用簡單易懂的語言&#xff0c;帶大家了解 Edge SCDN&#xff0c;探討其運用方法。?一、Edge SCDN 是什么&#…

探秘酵母單雜交技術:解鎖基因調控的密碼

在生命科學研究領域&#xff0c;基因的表達調控機制一直是科學家們關注的焦點。為了深入探究這一復雜過程&#xff0c;眾多先進技術應運而生&#xff0c;酵母單雜交技術便是其中極具價值的一項&#xff0c;它為研究 DNA 與蛋白質之間的相互作用提供了獨特視角與有效手段。酵母單…