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

Java Collections API 客製化實作指南(上):核心動機與抽象骨架

     編輯:Java 程式設計入門

為什麼要自造集合?

Java 平台提供的 ArrayList、HashMap 等通用實作已覆蓋 99% 場景,但特定領域仍需客製化:

  • 持久化集合: 資料需跨 JVM 存活,底層掛接資料庫或分散式存儲(如 Redis、Cassandra)。
  • 應用專屬語意: 即時遙測資料的 Map,get() 觸發感測器讀取而非記憶體查找。
  • 高併發場景: JDK 同步包裝器鎖定整個集合,吞吐率低;需分段鎖(如 ConcurrentHashMap)或無鎖資料結構。
  • 特定效能優化:
    • 小定義域 Set → 位向量,O(1) 空間極小。
    • 大量重複元素 List → 執程長編碼,犧牲隨機存取換空間。
  • 功能增強: 兼具 Hash 查找與插入順序迭代的 LinkedHashMap;允許重複元素的 Multiset(Bag)。
  • 便利性封裝: 單一鍵值對的不可變 Map、連續整數區間 List 等工具類。
  • 適配器模式: 將舊有專屬集合 API 包裝為標準 Collection 介面,無縫接入新框架。

抽象實作類:客製化的捷徑

Java 提供 AbstractCollection、AbstractList、AbstractSet、AbstractMap 等骨架類,已實作介面中非核心方法(如 toString()、containsAll()),僅需實作核心抽象方法:

介面骨架類必須實作的核心方法
CollectionAbstractCollectioniterator()、size()
ListAbstractListget(int)、size()(可選 set、add、remove)
SetAbstractSet繼承 AbstractCollection,無額外核心方法
MapAbstractMapentrySet()

範例:Arrays.asList() 內部實作

public static List asList(Object[] a) {
    return new ArrayList(a);  // 內部私有類別
}
private static class ArrayList extends AbstractList
        implements RandomAccess, java.io.Serializable {
    private final Object[] a;
    ArrayList(Object[] array) { this.a = array; }
    public Object get(int index) { return a[index]; }
    public Object set(int index, Object element) {
        Object old = a[index];
        a[index] = element;
        return old;
    }
    public int size() { return a.length; }
    // 其餘 add/remove 拋出 UnsupportedOperationException
}

此實作:

  1. 繼承 AbstractList 自動獲得 indexOf、contains、toArray 等預設行為。
  2. 實作 RandomAccess 標記介面,讓 Collections.sort 等演算法選用隨機存取優化路徑。
  3. 底層直接包裝陣列,固定大小、不支援結構性修改,極輕量。

下一步預告

下集將實戰打造一個「高併發、分段鎖、支援 TTL 過期淘汰」的 CacheMap,示範如何組合 AbstractMap、ConcurrentHashMap 內部結構與 ScheduledExecutorService 實現企業級快取組件。

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