基本簡述
Hashtable的實例有兩個參數影響其性能:初始容量和加載因子。容量是哈希表中桶的數量,初始容量就是哈希表創建時的容量。注意,哈希表的狀态為open:在發生“哈希沖突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜索。加載因子是對哈希表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和加載因子這兩個參數隻是對該實現的提示。關于何時以及是否調用rehash方法的具體細節則依賴于該實現。
通常,默認加載因子(.75)在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查找某個條目的時間(在大多數Hashtable操作中,包括get和put操作,都反映了這一點)。
初始容量主要控制空間消耗與執行rehash操作所需要的時間損耗之間的平衡。如果初始容量大于Hashtable所包含的最大條目數除以加載因子,則永遠不會發生rehash操作。但是,将初始容量設置太高可能會浪費空間。
如果很多條目要存儲在一個Hashtable中,那麼與根據需要執行自動rehashing操作來增大表的容量的做法相比,使用足夠大的初始容量創建哈希表或許可以更有效地插入條目。
下面這個示例創建了一個數字的哈希表。它将數字的名稱用作鍵:
Hashtablenumbers
=newHashtable();
numbers.add("one",1);
numbers.add("two",2);
numbers.add("three",3);
要獲取一個數字,可以使用以下代碼:
Integern=numbers.get("two");
if(n!=null){
System.out.println("two="+n);
}
}
在JAVA中使用put方法
如:
Hashtablenumbers
=newHashtable();numbers.put("one",1);numbers.put("two",2);numbers.put("three",3);
要檢索一個數字,可以使用以下代碼:
Integern=(Integer)numbers.get("two");
if(n!=null){
System.out.println("two="+n);
}
由所有類的“collection視圖方法”返回的collection的iterator方法返回的叠代器都是快速失敗的:在創建Iterator之後,如果從結構上對Hashtable進行修改,除非通過Iterator自身的remove方法,否則在任何時間以任何方式對其進行修改,Iterator都将抛出ConcurrentModificationException。因此,面對并發的修改,Iterator很快就會完全失敗,而不冒在将來某個不确定的時間發生任意不确定行為的風險。由Hashtable的鍵和元素方法返回的Enumeration不是快速失敗的。
注意,叠代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證。快速失敗叠代器會盡最大努力抛出ConcurrentModificationException。因此,為提高這類叠代器的正确性而編寫一個依賴于此異常的程序是錯誤做法:叠代器的快速失敗行為應該僅用于檢測程序錯誤。
在.NETwork中,Hashtable是System.Collections命名空間提供的一個容器,用于處理和表現類似key/的鍵值對,其中key通常可用來快速查找,同時key是區分大小寫;用于存儲對應于key的值。Hashtable中key/鍵值對均為object類型,所以Hashtable可以支持任何類型的key/鍵值對.
簡單操作
常見功能
在哈希表中添加一個key/鍵值對:HashtableObject.Add(key,);
在哈希表中去除某個key/鍵值對:HashtableObject.Remove(key);
從哈希表中移除所有元素:HashtableObject.Clear();
判斷哈希表是否包含特定鍵key:HashtableObject.Contains(key);
下面控制台程序将包含以上所有操作:
usingSystem;
usingSystem.Collections;//使用Hashtable時,必須引入這個命名空間
classhashtable
{
publicstaticvoidMain()
{
Hashtableht=newHashtable();//創建一個Hashtable實例
//key值唯一,value值可以重複.
ht.Add("E","e");//添加key/鍵值對
ht.Add("A","a");
ht.Add("C","c");
ht.Add("B","b");
strings=(string)ht["A"];
if(ht.Contains("E"))//判斷哈希表是否包含特定鍵,其返回值為true或false
Console.WriteLine("theEkey:exist");
ht.Remove("C");//移除一個key/鍵值對
Console.WriteLine(ht["A"]);//此處輸出a
ht.Clear();//移除所有元素
Console.WriteLine(ht["A"]);//此處将不會有任何輸出
}
}
哈希表
遍曆哈希表需要用到DictionaryEntryObject,代碼如下:
foreach(DictionaryEntrydeinht)//ht為一個Hashtable實例
{
Console.WriteLine(de.Key);//de.Key對應于key/鍵值對key
Console.WriteLine(de.Value);//de.Key對應于key/鍵值對
}
哈希表排序
對哈希表進行排序在這裡的定義是對key/鍵值對中的key按一定規則重新排列,但是實際上這個定義是不能實現的,因為我們無法直接在Hashtable進行對key進行重新排列,如果需要Hashtable提供某種規則的輸出,可以采用一種變通的做法:
ArrayListakeys=newArrayList(ht.Keys);//别忘了導入System.Collections
akeys.Sort();//按字母順序進行排序
foreach(stringskeyinakeys)
{
Console.Write(skey+":");
Console.WriteLine(ht[skey]);//排序後輸出
}



















