每個項目都是儲存在 DictionaryEntry 物件中的索引鍵/值組。索引鍵不可以是 nullNothingnullptrNull 參照 (即 Visual Basic 中的 Nothing),但值卻可以。
被 Hashtable 用來當做索引鍵的物件,必須覆寫 Object..::.GetHashCode 方法 (或 IHashCodeProvider 介面) 和 Object..::.Equals 方法 (或 IComparer 介面)。這兩種方法和介面的實作必須以相同的方式處理大小寫的問題,否則,Hashtable 可能無法正確作用。例如,建立 Hashtable 時,您必須使用 CaseInsensitiveHashCodeProvider 類別 (或任何不區分大小寫的 IHashCodeProvider 實作) 搭配 CaseInsensitiveComparer 類別 (或任何不區分大小寫的 IComparer 實作)。
而且,當索引鍵存在 Hashtable 中時,使用相同的參數呼叫這些方法必須產生相同的結果。替代方法是使用 Hashtable 建構函式搭配 IEqualityComparer 參數。如果索引鍵相等純粹是參考相等 (Reference Equality),那麼 Object..::.GetHashCode 和 Object..::.Equals 的繼承實作就足夠了。
只要索引鍵物件在 Hashtable 中做為索引鍵,索引鍵物件必須是不變的。
將元素加入 Hashtable 時,根據索引鍵的雜湊程式碼將元素放入雜湊桶 (Bucket)。後續的索引鍵查閱會使用索引鍵的雜湊程式碼只在一個特定的雜湊桶中進行搜尋,因此大致上可以降低尋找元素所需的索引鍵比較次數。
Hashtable 的載入因數決定雜湊桶元素的最大比例。較小的載入因數會加快增加記憶體消耗所花費的平均查閱時間。預設載入因數 1.0 通常會提供在速度和大小之間的最佳平衡。當建立 Hashtable 時,也可以指定不同的載入因數。
將元素加入 Hashtable 時,會增加 Hashtable 的實際載入因數。當實際載入因數達到指定的載入因數,Hashtable 中 Bucket 的數目會自動增加到大於 Hashtable Bucket 目前數目兩倍的最小質數。
Hashtable 中的每一個索引鍵物件必須提供自己的雜湊函式 (可以呼叫 GetHash 進行存取)。然而,任何實作 IHashCodeProvider 的物件可以傳遞至 Hashtable 建構函式 (Constructor),並且雜湊表中的所有物件是使用該雜湊函式。
Hashtable 的容量是 Hashtable 可以保存的項目數。元素加入 Hashtable 時,容量會依所需透過重新配置自動增加。
vb#c#
C# 語言 (在 Visual Basic 中為 for each) 的 foreach 陳述式 (Statement) 需要集合中每個元素的型別。由於 Hashtable 的各個項目都是機碼/值組配對,因此項目型別既不是機碼型別,也不是值型別。相反的,元素型別為 DictionaryEntry。例如:
foreach (DictionaryEntry de in myHashtable) {...}
For Each de as DictionaryEntry In myHashtable
...
Next de
vb#c#
foreach 陳述式是環繞列舉值的包裝函式,它只允許從集合讀取,而不允許寫入集合。
由於序列化及還原序列化 Hashtable 的列舉值可能會導致項目重新排序,因此不呼叫 Reset 方法不可能繼續列舉作業。
注意事項: |
|---|
由於索引鍵可以繼承,而且其行為已變更,所以比較作業無法使用 Equals 方法來保證其絕對的唯一性。 |