首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合與數組深度解析:結構、轉換與選型指南

     編輯:Java 綜合教學

Java 集合與數組深度解析:結構、轉換與選型指南

數組與集合是 Java 數據存儲的兩大基石。本文系統對比兩者差異,梳理集合體系架構,解析核心實現類特性與適用場景,並提供轉換實例與選型建議,助你精準選擇數據結構。

一、數組 vs 集合:核心差異

維度數組集合
大小固定,創建時指定動態可變,自動擴容
元素類型單一類型(基本/引用)引用類型,可存異構對象(配合泛型約束)
適用場景數量確定、高性能隨機訪問數量不定、頻繁增刪、複雜操作

互轉橋樑:`Collection.toArray()`、`Arrays.asList()`(注意返回固定長度 List)。

二、集合體系架構全景

Collection
├── List(有序、可重複)
│   ├── ArrayList  :數組實現,隨機訪問快,非線程安全
│   ├── LinkedList :鏈表實現,首尾增刪快,非線程安全
│   └── Vector     :數組實現,線程安全(同步開銷大,已淘汰)
├── Set(無序、不可重複)
│   ├── HashSet    :HashMap 底層,O(1) 查找,非線程安全
│   ├── LinkedHashSet:維護插入順序
│   └── TreeSet    :紅黑樹實現,有序,O(log n)
Map(鍵值對、Key 唯一)
    ├── HashMap    :數組+鏈表/紅黑樹,非線程安全,允許 null key/value
    ├── LinkedHashMap:維護插入/訪問順序
    ├── TreeMap    :紅黑樹,Key 有序
    └── Hashtable  :線程安全,不允許 null,已淘汰(推薦 ConcurrentHashMap)

三、核心實現類深度剖析

1. ArrayList vs LinkedList vs Vector

  • ArrayList:動態數組,擴容 1.5 倍,隨機訪問 O(1),中間插刪 O(n)。首選列表實現。
  • LinkedList:雙向鏈表,首尾操作 O(1),隨機訪問 O(n)。適合隊列、棧、頻繁頭尾操作場景。
  • Vector:同步方法,性能差,不推薦,多線程用 `Collections.synchronizedList` 或 `CopyOnWriteArrayList`。

2. HashMap vs Hashtable vs ConcurrentHashMap

  • HashMap:JDK 8 引入紅黑樹優化長鏈表,非線程安全,高性能。
  • Hashtable:全表鎖,吞吐極低,棄用。
  • ConcurrentHashMap:JDK 8 採用 CAS + synchronized + 節點鎖,分段鎖升級為細粒度鎖,高併發首選。

3. Set 實現選型

  • 去重 + 無序:HashSet
  • 去重 + 保持插入序:LinkedHashSet
  • 去重 + 自然/自定義排序:TreeSet

四、面向接口編程:彈性設計之道

// 良好實踐:聲明接口類型
List list = new ArrayList<>();
Map map = new HashMap<>();

// 切換實現零成本
List list2 = new LinkedList<>();
// 方法參數受益多態
public void process(List items) { ... }

優勢:解耦具體實現、便於測試替換、支援泛型演算法複用。

五、實戰代碼片段

int[] arr = {1, 2, 3};
String[] strs = {"aaa", "bbb"};

List list = new ArrayList<>();
List intList = new ArrayList<>();
List> complexList = new ArrayList<>();
List cityList = new ArrayList<>();

六、選型決策表

需求推薦結構備註
高頻隨機訪問、少量增刪ArrayList預估大小用 `ensureCapacity`
高頻頭尾增刪、隊列/棧LinkedList實現 Deque 接口
Key-Value 快速查找、非線程安全HashMap預設負載因子 0.75
Key-Value 高併發ConcurrentHashMapJDK 8+ 無段鎖設計
去重、無序HashSet底層借用 HashMap
去重、有序TreeSet實現 NavigableSet

總結

理解底層數據結構(動態數組、鏈表、紅黑樹、哈希表)是選型關鍵。堅持面向接口編程,優先使用非同步集合,併發場景轉用 `java.util.concurrent` 包專用類。數組與集合互轉時注意副本與視圖差異,避免意外修改共享數據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved