天天看點

HashTable

簡述
簡單操作
周遊哈希表
對哈希表進行排序

編輯本段簡述

  Hashtable 的執行個體有兩個參數影響其性能:初始容量 和加載因子。容量 是哈希表中桶 的數量,初始容量 就是哈希表建立時的容量。注意,哈希表的狀态為 open:在發生“哈希沖突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜尋。加載因子 是對哈希表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和加載因子這兩個參數隻是對該實作的提示。關于何時以及是否調用 rehash 方法的具體細節則依賴于該實作。

  通常,預設加載因子(.75)在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查找某個條目的時間(在大多數 Hashtable 操作中,包括 get 和 put 操作,都反映了這一點)。

  初始容量主要控制空間消耗與執行 rehash 操作所需要的時間損耗之間的平衡。如果初始容量大于 Hashtable 所包含的最大條目數除以加載因子,則永遠 不會發生 rehash 操作。但是,将初始容量設定太高可能會浪費空間。

  如果很多條目要存儲在一個 Hashtable 中,那麼與根據需要執行自動 rehashing 操作來增大表的容量的做法相比,使用足夠大的初始容量建立哈希表或許可以更有效地插入條目。

  下面這個示例建立了一個數字的哈希表。它将數字的名稱用作鍵:

  Hashtable<String, Integer> numbers

  = new Hashtable<String, Integer>();

  numbers.put("one", 1);

  numbers.put("two", 2);

  numbers.put("three", 3);

  要擷取一個數字,可以使用以下代碼:

  Integer n = numbers.get("two");

  if (n != null) {

  System.out.println("two = " + n);

  }

  由所有類的“collection 視圖方法”傳回的 collection 的 iterator 方法傳回的疊代器都是快速失敗 的:在建立 Iterator 之後,如果從結構上對 Hashtable 進行修改,除非通過 Iterator 自身的 remove 方法,否則在任何時間以任何方式對其進行修改,Iterator 都将抛出ConcurrentModificationException。是以,面對并發的修改,Iterator 很快就會完全失敗,而不冒在将來某個不确定的時間發生任意不确定行為的風險。由 Hashtable 的鍵和元素方法傳回的 Enumeration 不 是快速失敗的。

  注意,疊代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證。快速失敗疊代器會盡最大努力抛出 ConcurrentModificationException。是以,為提高這類疊代器的正确性而編寫一個依賴于此異常的程式是錯誤做法:疊代器的快速失敗行為應該僅用于檢測程式錯誤。

  在.NET work中,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);

  下面控制台程式将包含以上所有操作:

  using System;

  using System.Collections; //使用Hashtable時,必須引入這個命名空間

  class hashtable

  {

  public static void Main()

  Hashtable ht=new Hashtable(); //建立一個Hashtable執行個體

  //key值唯一,value值可以重複.

  ht.put("E","e");//添加key/鍵值對

  ht.put("A","a");

  ht.put("C","c");

  ht.Add("B","b");

  string s=(string)ht["A"];

  if(ht.Contains("E")) //判斷哈希表是否包含特定鍵,其傳回值為true或false

  Console.WriteLine("the E key:exist");

  ht.Remove("C");//移除一個key/鍵值對

  Console.WriteLine(ht["A"]);//此處輸出a

  ht.Clear();//移除所有元素

  Console.WriteLine(ht["A"]); //此處将不會有任何輸出

編輯本段周遊哈希表

  周遊哈希表需要用到DictionaryEntry Object,代碼如下:

  foreach(DictionaryEntry de in ht) //ht為一個Hashtable執行個體

  Console.WriteLine(de.Key);//de.Key對應于key/鍵值對key

  Console.WriteLine(de.Value);//de.Key對應于key/鍵值對

編輯本段對哈希表進行排序

  對哈希表進行排序在這裡的定義是對key/鍵值對中的key按一定規則重新排列,但是實際上這個定義是不能實作的,因為我們無法直接在Hashtable進行對key進行重新排列,如果需要Hashtable提供某種規則的輸出,可以采用一種變通的做法:

  ArrayList akeys=new ArrayList(ht.Keys); //别忘了導入System.Collections

  akeys.Sort(); //按字母順序進行排序

  foreach(string skey in akeys)

  Console.Write(skey+ ":");

  Console.WriteLine(ht[skey]);//排序後輸出

繼續閱讀