Java集合(含List、Map、Set和Queue)超詳細(xì)講解

Java 集合框架全解析
Java 集合框架是 Java 編程中最基礎(chǔ)、最常用的部分之一。它為我們提供了一整套標(biāo)準(zhǔn)化的數(shù)據(jù)結(jié)構(gòu)和算法實(shí)現(xiàn),包括 List、Set、Queue、Map 等,用于高效地存儲(chǔ)、訪問(wèn)和操作對(duì)象集合。
集合框架的整體結(jié)構(gòu)
Java 集合大體分為兩條主線:
Collection(單值集合)
│
├── List(有序,可重復(fù))
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector / Stack
│
├── Set(無(wú)序,不可重復(fù))
│ ├── HashSet
│ ├── LinkedHashSet
│ └── TreeSet
│
└── Queue(隊(duì)列)
├── ArrayDeque
├── LinkedList
└── PriorityQueue
Map(鍵值對(duì)集合)
├── HashMap
├── LinkedHashMap
└── TreeMapList:有序可重復(fù)的集合
ArrayList ( 動(dòng)態(tài)數(shù)組)
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
- 底層是 動(dòng)態(tài)數(shù)組;
- 支持隨機(jī)訪問(wèn)(時(shí)間復(fù)雜度 O(1));
- 中間插入、刪除代價(jià)高(涉及數(shù)組移動(dòng));
- 自動(dòng)擴(kuò)容(通常 1.5 倍)。
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
int n = 10;
// 初始化 ArrayList,大小為 10,元素值都為 0
ArrayList<Integer> nums = new ArrayList<>(Collections.nCopies(n, 0));
// 輸出:false
System.out.println(nums.isEmpty());
// 輸出:10
System.out.println(nums.size());
// 在數(shù)組尾部插入一個(gè)元素 20
nums.add(20);
// 輸出:11
System.out.println(nums.size());
// 得到數(shù)組最后一個(gè)元素
// 輸出:20
System.out.println(nums.get(nums.size() - 1));
// 刪除數(shù)組的最后一個(gè)元素
nums.remove(nums.size() - 1);
// 輸出:10
System.out.println(nums.size());
// 可以通過(guò)索引直接取值或修改
nums.set(0, 11);
// 輸出:11
System.out.println(nums.get(0));
// 在索引 3 處插入一個(gè)元素 99
nums.add(3, 99);
// 刪除索引 2 處的元素
nums.remove(2);
// 交換 nums[0] 和 nums[1]
Collections.swap(nums, 0, 1);
// 遍歷數(shù)組
// 輸出:0 11 99 0 0 0 0 0 0 0
for(int num : nums) {
System.out.print(num + " ");
}
System.out.println();
}
}適用于 查找頻繁、插入較少 的場(chǎng)景。
LinkedList ( 雙向鏈表)
LinkedList<String> list = new LinkedList<>();
list.add("1");
list.add("2");
list.add("3");
特征:
- 底層是 雙向鏈表;
- 不支持隨機(jī)訪問(wèn)(時(shí)間復(fù)雜度 O(n));
- 任意位置插入、刪除高效;
- 每個(gè)節(jié)點(diǎn)多存前后指針,內(nèi)存開(kāi)銷更大。
適用于 插入、刪除頻繁 的場(chǎng)景。
import java.util.Arrays;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
// 初始化鏈表
LinkedList<Integer> lst = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
// 檢查鏈表是否為空,輸出:false
System.out.println(lst.isEmpty());
// 獲取鏈表的大小,輸出:5
System.out.println(lst.size());
// 在鏈表頭部插入元素 0
lst.addFirst(0);
// 在鏈表尾部插入元素 6
lst.addLast(6);
// 獲取鏈表頭部和尾部元素,輸出:0 6
System.out.println(lst.getFirst() + " " + lst.getLast());
// 刪除鏈表頭部元素
lst.removeFirst();
// 刪除鏈表尾部元素
lst.removeLast();
// 在鏈表中插入元素
// 移動(dòng)到第三個(gè)位置
lst.add(2, 99);
// 刪除鏈表中某個(gè)元素
lst.remove(1);
// 遍歷鏈表
// 輸出:1 99 3 4 5
for(int val : lst) {
System.out.print(val + " ");
}
System.out.println();
}
}Vector & Stack(歷史遺留)
Vector是線程安全的ArrayList;- 每個(gè)方法都加了
synchronized,性能較低; - 已被
ArrayList替代; Stack繼承自Vector,實(shí)現(xiàn) LIFO(后進(jìn)先出) 棧結(jié)構(gòu);- 推薦使用
ArrayDeque替代。
Set:無(wú)序且元素唯一
HashSet ( 基于 HashMap)
HashSet<String> set = new HashSet<>();
set.add("一");
set.add("二");
set.add("三");
- 底層由
HashMap實(shí)現(xiàn); - 元素作為 key,value 為固定對(duì)象;
- 自動(dòng)去重;
- 不保證順序。
適用于 去重、快速查找。
import java.util.Arrays;
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
// 初始化哈希集合
HashSet<Integer> hashset = new HashSet<>(Arrays.asList(1, 2, 3, 4));
// 檢查哈希集合是否為空,輸出:false
System.out.println(hashset.isEmpty());
// 獲取哈希集合的大小,輸出:4
System.out.println(hashset.size());
// 查找指定元素是否存在
// 輸出:Element 3 found.
if(hashset.contains(3)) {
System.out.println("Element 3 found.");
} else {
System.out.println("Element 3 not found.");
}
// 插入一個(gè)新的元素
hashset.add(5);
// 刪除一個(gè)元素
hashset.remove(2);
// 輸出:Element 2 not found.
if(hashset.contains(2)) {
System.out.println("Element 2 found.");
} else {
System.out.println("Element 2 not found.");
}
// 遍歷哈希集合
// 輸出(順序可能不同):
// 1
// 3
// 4
// 5
for(int element : hashset) {
System.out.println(element);
}
}
}LinkedHashSet (有序 HashSet)
LinkedHashSet<String> set = new LinkedHashSet<>();
set.add("一");
set.add("二");
set.add("三");
- 繼承
HashSet; - 底層由
LinkedHashMap實(shí)現(xiàn); - 保持插入順序;
- 查找性能與
HashSet相近。
適用于 既想去重又保留插入順序 的場(chǎng)景。
TreeSet ( 有序去重集合)
TreeSet<String> set = new TreeSet<>();
set.add("一");
set.add("二");
set.add("三");
- 基于 紅黑樹 實(shí)現(xiàn);
- 元素自動(dòng)排序;
- 不允許
null; - 可自定義排序規(guī)則(
Comparator)。
適用于 需要自動(dòng)排序 的場(chǎng)景。
Queue:隊(duì)列
ArrayDeque ( 高效雙端隊(duì)列)
ArrayDeque<String> deque = new ArrayDeque<>();
deque.add("一");
deque.add("二");
deque.add("三");
- 基于循環(huán)數(shù)組;
- 可在兩端插入/刪除;
- 性能優(yōu)于
LinkedList; - 替代
Stack和Queue。
LinkedList (可作隊(duì)列使用)
LinkedList<String> queue = new LinkedList<>();
queue.offer("一成");
queue.poll();
- 同時(shí)實(shí)現(xiàn)了
List和Deque; - 適合頻繁插入刪除;
- 支持隊(duì)首、隊(duì)尾操作;
- 內(nèi)存占用高于
ArrayDeque。
PriorityQueue — 優(yōu)先級(jí)隊(duì)列
PriorityQueue<Student> queue = new PriorityQueue<>(new StudentComparator());
- 底層是 堆結(jié)構(gòu);
- 出隊(duì)順序由優(yōu)先級(jí)決定;
- 元素需實(shí)現(xiàn)
Comparable或傳入Comparator。
適用于 任務(wù)調(diào)度、最小/最大堆 場(chǎng)景。
import java.util.Queue;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
// 初始化一個(gè)空的整型隊(duì)列 q
Queue<Integer> q = new LinkedList<>();
// 在隊(duì)尾添加元素
q.offer(10);
q.offer(20);
q.offer(30);
// 檢查隊(duì)列是否為空,輸出:false
System.out.println(q.isEmpty());
// 獲取隊(duì)列的大小,輸出:3
System.out.println(q.size());
// 獲取隊(duì)列的隊(duì)頭元素
// 輸出:10
System.out.println(q.peek());
// 刪除隊(duì)頭元素
q.poll();
// 輸出新的隊(duì)頭元素:20
System.out.println(q.peek());
}
}Map:鍵值對(duì)集合
HashMap (哈希表實(shí)現(xiàn))
HashMap<String, String> map = new HashMap<>();
map.put("一成", "yicheng");
map.put("在成長(zhǎng)", "zaichengzhang");
- 鍵唯一,值可重復(fù);
- 查找/插入效率高;
- 默認(rèn)容量 16,負(fù)載因子 0.75;
- 可存
null鍵與null值; - 無(wú)序。
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
// 初始化哈希表
HashMap<Integer, String> hashmap = new HashMap<>();
hashmap.put(1, "one");
hashmap.put(2, "two");
hashmap.put(3, "three");
// 檢查哈希表是否為空,輸出:false
System.out.println(hashmap.isEmpty());
// 獲取哈希表的大小,輸出:3
System.out.println(hashmap.size());
// 查找指定鍵值是否存在
// 輸出:Key 2 -> two
if(hashmap.containsKey(2)) {
System.out.println("Key 2 -> " + hashmap.get(2));
} else {
System.out.println("Key 2 not found.");
}
// 獲取指定鍵對(duì)應(yīng)的值,若不存在會(huì)返回 null
// 輸出:null
System.out.println(hashmap.get(4));
// 獲取指定鍵對(duì)應(yīng)的值,若不存在則返回默認(rèn)值
// 輸出:defaultVal
System.out.println(hashmap.getOrDefault(4, "defaultVal"));
// 插入一個(gè)新的鍵值對(duì)
hashmap.put(4, "four");
// 獲取新插入的值,輸出:four
System.out.println(hashmap.get(4));
// 刪除鍵值對(duì)
hashmap.remove(3);
// 檢查刪除后鍵 3 是否存在
// 輸出:Key 3 not found.
if(hashmap.containsKey(3)) {
System.out.println("Key 3 -> " + hashmap.get(3));
} else {
System.out.println("Key 3 not found.");
}
// 遍歷哈希表
// 輸出(順序可能不同):
// 1 -> one
// 2 -> two
// 4 -> four
for(Map.Entry<Integer, String> pair : hashmap.entrySet()) {
System.out.println(pair.getKey() + " -> " + pair.getValue());
}
}
}LinkedHashMap (有序 HashMap)
LinkedHashMap<String, String> linkedMap = new LinkedHashMap<>();
linkedMap.put("一成", "yicheng");
linkedMap.put("在成長(zhǎng)", "zaichengzhang");
- 保留插入順序;
- 可設(shè)置訪問(wèn)順序;
- 常用于實(shí)現(xiàn) LRU 緩存。
TreeMap ( 紅黑樹實(shí)現(xiàn))
TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("a", "apple");
treeMap.put("b", "banana");
treeMap.put("c", "cat");
- 鍵有序;
- 基于紅黑樹;
- 查找、插入、刪除為 O(log n)。
適用于 需要有序 Map 的場(chǎng)景。
| 需求 | 推薦集合 | 說(shuō)明 |
|---|---|---|
| 有序且可重復(fù) | ArrayList | 動(dòng)態(tài)數(shù)組,隨機(jī)訪問(wèn)快 |
| 插入刪除多 | LinkedList | 鏈表結(jié)構(gòu),插入刪除快 |
| 去重但無(wú)序 | HashSet | 由 HashMap 實(shí)現(xiàn) |
| 去重且有序 | LinkedHashSet | 保留插入順序 |
| 自動(dòng)排序 | TreeSet / TreeMap | 基于紅黑樹 |
| 雙端隊(duì)列 | ArrayDeque | 替代 Stack/Queue |
| 按優(yōu)先級(jí)取出 | PriorityQueue | 堆結(jié)構(gòu) |
| 鍵值映射 | HashMap | 最常用的 Map |
| 有序 Map | LinkedHashMap / TreeMap | 插入或自然順序 |
Java 集合框架
│
├── Collection
│ ├── List → ArrayList / LinkedList / Vector / Stack
│ ├── Set → HashSet / LinkedHashSet / TreeSet
│ └── Queue → ArrayDeque / LinkedList / PriorityQueue
│
└── Map
├── HashMap
├── LinkedHashMap
└── TreeMap到此這篇關(guān)于Java集合(含List、Map、Set和Queue)超詳細(xì)講解的文章就介紹到這了,更多相關(guān)java list map set queue內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java持久層框架MyBatis簡(jiǎn)單實(shí)例
MyBatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。本文重點(diǎn)給大家介紹Java持久層框架MyBatis簡(jiǎn)單實(shí)例,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧2016-07-07
基于JavaSwing+mysql開(kāi)發(fā)一個(gè)學(xué)生社團(tuán)管理系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)
項(xiàng)目使用Java swing+mysql開(kāi)發(fā),可實(shí)現(xiàn)基礎(chǔ)數(shù)據(jù)維護(hù)、用戶登錄注冊(cè)、社團(tuán)信息列表查看、社團(tuán)信息添加、社團(tuán)信息修改、社團(tuán)信息刪除以及退出注銷等功能、界面設(shè)計(jì)比較簡(jiǎn)單易學(xué)、適合作為Java課設(shè)設(shè)計(jì)以及學(xué)習(xí)技術(shù)使用,需要的朋友參考下吧2021-08-08
簡(jiǎn)單總結(jié)Java IO中stream流的使用方法
這篇文章主要介紹了Java IO中stream流的使用方法的簡(jiǎn)單總結(jié),包括數(shù)據(jù)流和打印流等Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-03
Java簽名加密與驗(yàn)證實(shí)現(xiàn)過(guò)程
本文詳細(xì)介紹了Java中簽名加密驗(yàn)證簽名和SHA1withRSAUtil證書簽名算法的實(shí)現(xiàn)原理及流程,通過(guò)描述數(shù)據(jù)準(zhǔn)備、哈希計(jì)算、簽名生成、數(shù)據(jù)封裝、數(shù)據(jù)傳輸和服務(wù)器驗(yàn)證的完整過(guò)程,展示了如何在Java中確保數(shù)據(jù)傳輸?shù)陌踩院万?yàn)證2025-10-10
SpringBoot預(yù)加載與懶加載實(shí)現(xiàn)方法超詳細(xì)講解
Spring一直被詬病啟動(dòng)時(shí)間慢,可Spring/SpringBoot是輕量級(jí)的框架。因?yàn)楫?dāng)Spring項(xiàng)目越來(lái)越大的時(shí)候,在啟動(dòng)時(shí)加載和初始化Bean就會(huì)變得越來(lái)越慢,很多時(shí)候我們?cè)趩?dòng)時(shí)并不需要加載全部的Bean,在調(diào)用時(shí)再加載就行,那這就需要預(yù)加載與懶加載的功能了2022-11-11
SpringAOP中的動(dòng)態(tài)代理技術(shù)深入解析
這篇文章主要介紹了SpringAOP中的動(dòng)態(tài)代理技術(shù)深入解析,spring默認(rèn)使用JDK動(dòng)態(tài)代理實(shí)現(xiàn)AOP,類如果實(shí)現(xiàn)了接口,spring就會(huì)用JDK動(dòng)態(tài)代理實(shí)現(xiàn)AOP,如果目標(biāo)類沒(méi)有實(shí)現(xiàn)接口,spring則使用Cglib動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)AOP,需要的朋友可以參考下2024-01-01
Java線程休眠_(dá)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
sleep() 的作用是讓當(dāng)前線程休眠,即當(dāng)前線程會(huì)從“運(yùn)行狀態(tài)”進(jìn)入到“休眠(阻塞)狀態(tài)”。下面通過(guò)實(shí)例代碼給大家介紹Java線程休眠的知識(shí),需要的朋友參考下吧2017-05-05
SpringBoot實(shí)現(xiàn)在webapp下直接訪問(wèn)html,jsp
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)在webapp下直接訪問(wèn)html,jsp問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
spring?Cloud微服務(wù)阿里開(kāi)源TTL身份信息的線程間復(fù)用
這篇文章主要為大家介紹了spring?Cloud微服務(wù)中使用阿里開(kāi)源TTL身份信息的線程間復(fù)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

