Hashtable

Hashtable

類實現一個哈希表,該哈希表將鍵映射到相應的值。任何非 null 對象都可以用作鍵或值。為了成功地在哈希表中存儲和獲取對象,用作鍵的對象必須實現 hashCode 方法和 equals 方法。

基本介紹

  • 中文名:哈希表
  • 外文名:HashTable
  • 參數影響:初始容量 和載入因子
  • 實現:hashCode方法和equals方法
  • 用途:存儲和獲取對象
簡述,簡單操作,哈希表,排序,

簡述

Hashtable 的實例有兩個參數影響其性能:初始容量 和載入因子。容量 是哈希表中桶 的數量,初始容量 就是哈希表創建時的容量。注意,哈希表的狀態為 open:在發生“哈希衝突”的情況下,單個桶會存儲多個條目,這些條目必須按順序搜尋。載入因子 是對哈希表在其容量自動增加之前可以達到多滿的一個尺度。初始容量和載入因子這兩個參數只是對該實現的提示。關於何時以及是否調用 rehash 方法的具體細節則依賴於該實現。
通常,默認載入因子(.75)在時間和空間成本上尋求一種折中。載入因子過高雖然減少了空間開銷,但同時也增加了查找某個條目的時間(在大多數 Hashtable 操作中,包括 get 和 put 操作,都反映了這一點)。
初始容量主要控制空間消耗與執行 rehash 操作所需要的時間損耗之間的平衡。如果初始容量大於 Hashtable 所包含的最大條目數除以載入因子,則永遠 不會發生 rehash 操作。但是,將初始容量設定太高可能會浪費空間。
如果很多條目要存儲在一個 Hashtable 中,那么與根據需要執行自動 rehashing 操作來增大表的容量的做法相比,使用足夠大的初始容量創建哈希表或許可以更有效地插入條目。
下面這個示例創建了一個數字的哈希表。它將數字的名稱用作鍵:
Hashtable<String, Integer> numbers = new Hashtable<String, Integer>();numbers.add("one", 1);numbers.add("two", 2);numbers.add("three", 3);
要獲取一個數字,可以使用以下代碼:
Integer n = numbers.get("two");if (n != null) {System.out.println("two = " + n);}}
在JAVA中使用put方法
如:
Hashtable<String, Integer> numbers = new Hashtable<String, Integer>(); numbers.put("one", 1); numbers.put("two", 2); numbers.put("three", 3);
要檢索一個數字,可以使用以下代碼:
Integer n = (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。因此,為提高這類疊代器的正確性而編寫一個依賴於此異常的程式是錯誤做法:疊代器的快速失敗行為應該僅用於檢測程式錯誤
在.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.Add("E","e");//添加key/鍵值對ht.Add("A","a");ht.Add("C","c");ht.Add("B","b");string s=(string)ht["A"];if(ht.Contains("E")) //判斷哈希表是否包含特定鍵,其返回值為true或falseConsole.WriteLine("the E key:exist");ht.Remove("C");//移除一個key/鍵值對Console.WriteLine(ht["A"]);//此處輸出aht.Clear();//移除所有元素Console.WriteLine(ht["A"]); //此處將不會有任何輸出}}

哈希表

遍歷哈希表需要用到DictionaryEntry Object,代碼如下:
for(DictionaryEntry de in ht) //ht為一個Hashtable實例{Console.WriteLine(de.Key);//de.Key對應於key/鍵值對keyConsole.WriteLine(de.Value);//de.Key對應於key/鍵值對}

排序

對哈希表進行排序在這裡的定義是對key/鍵值對中的key按一定規則重新排列,但是實際上這個定義是不能實現的,因為我們無法直接在Hashtable進行對key進行重新排列,如果需要Hashtable提供某種規則的輸出,可以採用一種變通的做法:
ArrayList akeys=new ArrayList(ht.Keys); //別忘了導入System.Collectionsakeys.Sort(); //按字母順序進行排序for(string skey in akeys){Console.Write(skey+ ":");Console.WriteLine(ht[skey]);//排序後輸出}

相關詞條

熱門詞條

聯絡我們