Java 陣列本質是物件,儲存於堆疊記憶體,元素型別統一(基本型別存值、參考型別存指標)。宣告與初始化五大模式:
// 1. 僅宣告參考
String[] difWords;
Point[] hits;
// 2. 方法回傳型別宣告慣例
String[] difWords;
Point[] hits;
// 3. 動態配置指定長度
String[] names = new String[10];
int[] temps = new int[10];
// 4. 靜態初始化
String[] names = {"墨西哥椒", "安海姆椒", "塞拉諾椒"};
// 5. 多維陣列(實為陣列的陣列)
int[][] coords = new int[12][12];
關鍵屬性 length 提供長度查詢,無 size() 方法。陣列實作 Cloneable、Serializable,支援 Arrays 工具類排序、搜尋、複製、轉字串等操作。
早期集合統一迭代協定,兩大核心方法:
hasMoreElements():判斷是否有下一元素nextElement():取得下一元素,無元素拋出 NoSuchElementException現代程式碼建議使用 Iterator 或增強型 for 迴圈取代。
適用於大量布林旗標儲存(如權限位圖、布隆過濾器原型)。BitSet bits = new BitSet(64) 建立 64 位元集合,核心操作:
set(index) / clear(index):置 1/0get(index):讀取位元值size():邏輯長度xor(bitSet)、and()、or():位元邏輯運算早期 ArrayList 同步化版本,容量自動增長策略可控:new Vector(20, 5) 初始 20、每次增 5。所有方法皆 synchronized,多執行緒環境下無需額外同步,但單執行緒效能較 ArrayList 低。現代開發優先選用 ArrayList + 手動同步或 CopyOnWriteArrayList。
繼承 Vector,提供棧語義方法:
push(E item) 入棧、pop() 出棧peek() 偷看棧頂不移除empty() 判斷空棧、search(Object o) 從棧頂往下搜尋(1-based 索引)建議改用 Deque<E> 介面與 ArrayDeque 實作,效能更優、API 更完整。
Dictionary 為抽象類別定義 put/get/remove/keys/elements 協定。Hashtable 實作之並實作 Serializable、Cloneable,所有方法同步化。關鍵差異:Hashtable 不允許 null 鍵/值,HashMap 允許單一 null 鍵與多個 null 值且非同步,單執行緒效能遠優於 Hashtable。現代開發首選 HashMap、ConcurrentHashMap(高併發)、LinkedHashMap(保持插入/存取順序)。
| 場景 | 推薦類別 | 備註 |
|---|---|---|
| 固定大小、高效能、基本型別 | 陣列 T[] | 避免裝箱/拆箱開銷 |
| 動態陣列、單執行緒、隨機存取頻繁 | ArrayList | 預設初始容量 10,擴容 1.5 倍 |
| 動態陣列、多執行緒、舊版相容 | Vector | 同步開銷大,慎用 |
| 棧/佇列雙端操作 | ArrayDeque | 非同步、陣列實作、無容量上限 |
| 鍵值對、單執行緒、允許 null | HashMap | JDK 8+ 鏈表轉紅黑樹優化 |
| 鍵值對、高併發讀寫 | ConcurrentHashMap | CAS + synchronized 細粒度鎖 |
| 位元旗標、大量布林狀態 | BitSet | 記憶體極度緊湊 |
List<String> list = new ArrayList<>(); 利於重構替換實作。new ArrayList(1000)。Vector、Hashtable、Collections.synchronizedList() 在高併發下成為瓶頸,改用 java.util.concurrent 套件。Arrays、Collections 提供排序、搜尋、不可變視圖、同步包裝等現成功能,勿重複造輪子。