C#中Hashtable和HashMap的區別

風靈使發表於2019-03-07

在.Net 模仿java 的過程中拋棄了 HashMap ,所以以後再去面試.Net的時候當別人問你HashTableHashMap 的區別的時候,請告訴他,C#.Net 中 沒有HashMap

這裡簡單分析他們的區別。

1.HashTable的方法是同步的,HashMap未經同步,所以在多執行緒場合要手動同步HashMap這個區別就像VectorArrayList一樣。

2.HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。

3.HashTable有一個contains(Object value),功能和containsValue(Object value)功能一樣。

4.HashTable使用EnumerationHashMap使用Iterator。 以上只是表面的不同,它們的實現也有很大的不同。

5.HashTablehash陣列預設大小是11,增加的方式是 old*2+1HashMaphash陣列的預設大小是16,而且一定是2的指數。

6.雜湊值的使用不同,HashTable直接使用物件的hashCode,程式碼是這樣的:

int hash = key.hashCode();

int index = (hash & 0x7FFFFFFF) % tab.length;

而HashMap重新計算hash值,而且用與代替求模:

 int hash = hash(k);

  int i = indexFor(hash, table.length);

  static int hash(Object x) {

  int h = x.hashCode();

  h += ~(h << 9);

  h ^= (h >>> 14);

  h += (h << 4);

  h ^= (h >>> 10);

  return h;

  }

  static int indexFor(int h, int length) {

  return h & (length-1);

  }

以上只是一些比較突出的區別,當然他們的實現上還是有很多不同的,比如HashMapnull的操作。

Hashtable和HashMap的區別:

1.HashtableDictionary的子類,HashMapMap介面的一個實現類;

2.Hashtable中的方法是同步的,而HashMap中的方法在預設情況下是非同步的。即是說,在多執行緒應用程式中,不用專門的操作就安全地可以使用Hashtable了;而對於HashMap,則需要額外的同步機制。但HashMap的同步問題可通過Collections的一個靜態方法得到解決:

  Map Collections.synchronizedMap(Map m)

這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多執行緒的環境中也是安全的。

3.在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。

Hashtable繼承自Dictionary類,而HashMap是Java的

雜湊表的簡單操作

在雜湊表中新增一個keyvalue鍵值對:HashtableObject.Add(key,value);

在雜湊表中去除某個keyvalue鍵值對: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例項
  ht.Add(E,e); //新增keyvalue鍵值對
  ht.Add(A,a);
  ht.Add(C,c);
  ht.Add(B,b);
 
  string s=(string)ht[A];
  if(ht.Contains(E)) //判斷雜湊表是否包含特定鍵,其返回值為true或false
    Console.WriteLine(the E keyexist);
  ht.Remove(C); //移除一個keyvalue鍵值對
  Console.WriteLine(ht[A]); //此處輸出a
  ht.Clear(); //移除所有元素
  Console.WriteLine(ht[A]); //此處將不會有任何輸出
  }
}

//三,遍歷雜湊表
//遍歷雜湊表需要用到DictionaryEntry Object,程式碼如下:

 
for(DictionaryEntry de in ht) //ht為一個Hashtable例項
 {
   Console.WriteLine(de.Key); //de.Key對應於keyvalue鍵值對key
   Console.WriteLine(de.Value); //de.Key對應於keyvalue鍵值對value
 }
 
//四,對雜湊表進行排序
/*對雜湊表進行排序在這裡的定義是對keyvalue鍵值對中的key按一定規則重新排列,但是實際上這個定義是不能實現的,因為我們無法直接在Hashtable進行對key進行重新排列,如果需要Hashtable提供某種規則的輸出,可以採用一種變通的做法:*/

ArrayList akeys=new ArrayList(ht.Keys); //別忘了匯入System.Collections
akeys.Sort(); //按字母順序進行排序
for(string skey in akeys)
 {
   Console.Write(skey + );
   Console.WriteLine(ht[skey]);排序後輸出
 }

相關文章