Hashtable 是 J2ME 核心集合,理解其內部機制能指導容量規劃、避免效能陷阱、排查記憶體異常。本文基於 CLDC 實現源碼,剖析結構佈局、關鍵方法與設計細節。
private transient HashtableEntry[] table; // 雜湊桶數組
private transient int count; // 實際元素數
transient 關鍵字:標記不參與序列化。CLDC Hashtable 不支援序列化,因核心容器欄位皆為 transient。
class HashtableEntry {
int hash; // 鍵的 hashCode
Object key; // 鍵
Object value; // 值
HashtableEntry next; // 下一個節點(鏈表解決衝突)
}
採用數組 + 鏈表(Separate Chaining)經典結構。
class HashtableEnumerator implements Enumeration {
boolean keys; // true=疊代鍵, false=疊代值
int index; // 當前掃描桶索引
HashtableEntry[] table; // 桶數組引用
HashtableEntry entry; // 當前鏈表節點
// 構造時 index 設為 table.length,從末尾向前掃描
// hasMoreElements() / nextElement() 協同推進
}
精妙寫法:while (index-- > 0 && (entry = table[index]) == null); 單行完成「向前找下一非空桶並定位鏈表頭」。
int index = (hash & 0x7FFFFFFF) % tab.length;
& 0x7FFFFFFF:確保非負(去除符號位)hash = key.hashCode()indexequals) → 替換值,返回舊值count++,檢查 count > threshold (capacity * 0.75) → rehash()equals 比對,命中返回 value,否則 nullnext 指針跳過目標節點count--,返回被刪除值newCapacity = oldCapacity * 2 + 1(保持質數特性)newTabletable = newTablenew Hashtable(預估元素數 / 0.75 + 1) 避免 rehashhashCode() 與 equals()Hashtable 以「數組 + 鏈表」、質數桶長度、固定負載因子、transient 非序列化等設計選擇,在極度受限的 CLDC 環境中平衡了效能、記憶體與代碼體積。讀懂源碼,才能真正駕馭這個看似簡單實則精妙的核心集合。