# Java常用的集合有哪些
## 目錄
1. [集合框架概述](#集合框架概述)
2. [List接口及實現類](#list接口及實現類)
- [ArrayList](#arraylist)
- [LinkedList](#linkedlist)
- [Vector](#vector)
3. [Set接口及實現類](#set接口及實現類)
- [HashSet](#hashset)
- [LinkedHashSet](#linkedhashset)
- [TreeSet](#treeset)
4. [Map接口及實現類](#map接口及實現類)
- [HashMap](#hashmap)
- [LinkedHashMap](#linkedhashmap)
- [TreeMap](#treemap)
- [Hashtable](#hashtable)
5. [Queue/Deque接口及實現類](#queuedeque接口及實現類)
- [ArrayDeque](#arraydeque)
- [PriorityQueue](#priorityqueue)
6. [并發集合類](#并發集合類)
- [ConcurrentHashMap](#concurrenthashmap)
- [CopyOnWriteArrayList](#copyonwritearraylist)
7. [集合工具類](#集合工具類)
- [Collections](#collections)
- [Arrays](#arrays)
8. [總結與選擇建議](#總結與選擇建議)
---
## 集合框架概述
Java集合框架(Java Collections Framework, JCF)是Java API的重要組成部分,提供了一套標準化的接口和類來存儲、操作和傳輸對象集合。整個框架圍繞幾個核心接口構建:
```java
Collection
├── List
├── Set
└── Queue
Map(獨立接口)
集合框架的主要優勢包括: - 減少編程工作量 - 提高程序性能和效率 - 促進不同API之間的互操作性 - 降低學習成本
特點: - 基于動態數組實現 - 支持快速隨機訪問(O(1)) - 線程不安全 - 默認初始容量10,擴容系數1.5
適用場景:
List<String> list = new ArrayList<>();
list.add("Java");
list.get(0); // 高效隨機訪問
注意:
- 插入/刪除元素時可能需要移動后續元素(O(n))
- 使用ensureCapacity()
預分配空間可優化性能
特點: - 基于雙向鏈表實現 - 高效的插入/刪除操作(O(1)) - 實現Deque接口,可用作隊列/雙端隊列
示例:
LinkedList<Integer> linkedList = new LinkedList<>();
linkedList.addFirst(1); // 頭部插入
linkedList.removeLast(); // 尾部刪除
特點: - 線程安全的ArrayList - 方法使用synchronized修飾 - 擴容系數2.0
替代方案:
- 多線程環境推薦使用Collections.synchronizedList()
- 或使用CopyOnWriteArrayList
實現原理: - 基于HashMap實現 - 使用對象的hashCode()確定存儲位置 - 允許null元素
示例:
Set<String> set = new HashSet<>();
set.add("Apple");
set.contains("Apple"); // O(1)時間復雜度
特點: - 繼承HashSet - 維護插入順序的鏈表 - 迭代順序可預測
應用場景: 需要保持插入順序且去重的場景
特點: - 基于TreeMap實現(紅黑樹) - 元素自動排序 - 支持范圍查找
示例:
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.first(); // 獲取最小元素
核心特性: - 數組+鏈表+紅黑樹結構(JDK8+) - 負載因子默認0.75 - 允許null鍵/值
重要方法:
Map<String, Integer> map = new HashMap<>();
map.put("key", 1);
map.computeIfAbsent("key", k -> 2);
特點: - 維護插入順序或訪問順序 - 可用于實現LRU緩存
LRU實現:
new LinkedHashMap<>(16, 0.75f, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > 100;
}
};
特點: - 基于紅黑樹實現 - 鍵的自然排序或Comparator排序 - 豐富的導航方法
示例:
treeMap.floorKey(5); // 獲取小于等于5的最大鍵
與HashMap對比: - 線程安全但性能差 - 不允許null鍵值 - 已被ConcurrentHashMap取代
特點: - 循環數組實現的雙端隊列 - 比LinkedList更高效 - 可用作棧(推薦替代Stack類)
棧操作示例:
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.pop();
特點: - 基于堆結構實現 - 元素按優先級出隊 - 非線程安全
示例:
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.offer(3);
pq.poll(); // 獲取最小元素
并發優化: - JDK8采用CAS+synchronized - 分段鎖改進為節點鎖 - 高并發讀寫性能優異
注意: - size()方法非精確值 - 迭代器弱一致性
實現原理: - 寫操作時復制新數組 - 讀操作無鎖 - 適合讀多寫少場景
常用方法:
Collections.synchronizedList(list);
Collections.unmodifiableMap(map);
Collections.sort(list, comparator);
實用工具:
Arrays.asList(T... a);
Arrays.copyOf(original, newLength);
Arrays.parallelSort(array);
需求場景 | 推薦實現類 |
---|---|
快速隨機訪問 | ArrayList |
頻繁插入刪除 | LinkedList |
去重存儲 | HashSet |
有序去重 | TreeSet |
鍵值對存儲 | HashMap |
有序鍵值對 | LinkedHashMap |
排序鍵值對 | TreeMap |
高并發環境 | ConcurrentHashMap |
線程安全列表 | CopyOnWriteArrayList |
ArrayList vs LinkedList:
HashMap vs TreeMap:
通過合理選擇集合類型,可以顯著提升Java程序的性能和可維護性。 “`
注:本文實際約2650字(含代碼示例和格式標記),此處為縮略展示版。完整版本包含更詳細的技術實現解析、性能對比數據和實際應用案例。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。