C#HashTable

 1.命名空间 : System.Collections 此命名空间必须引入。
    2.名称 :哈希表
    3.描述 :用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
    4.哈希表的简单操作:
        Hashtable hshTable = new Hashtable(); //  创建哈希表
        hshTable .Add("Person1",  "zhanghf");  //  往哈希表里添加键值对
        hshTable .Clear();  //移除哈希表里所有的键值对
        hshTable .Contains("Person1");   //判断哈希表里是否包含该键
        string name = (string)hshTable["Person1"].ToString(); //取哈希表里指定键的值
        hshTable.Remove("Person1"); //  删除哈希表里指定键的键值对
         ht["A"] ="你好";            //哈希表中的某个键赋值
       遍历哈希表需要用到DictionaryEntry Object,代码如下:
      方法1 for(DictionaryEntry de in ht) //ht为一个Hashtable实例
        {
               Console.WriteLine(de.Key);//de.Key对应于key/value键值对key
               Console.WriteLine(de.Value);//de.Key对应于key/value键值对value
         }
       方法2 IDictionaryEnumerator enumerator = ht.GetEnumerator();  
             while (enumerator.MoveNext())  
         {  
                Console.WriteLine(enumerator.Key);  
                Console.WriteLine(enumerator.Value);  
         }  
        注意遍历输出为控制台,在浏览器看不到。
        方法3。遍历为可以输出到浏览器。
          IDictionaryEnumerator en = hshTable.GetEnumerator();  //  遍历哈希表所有的键,读出相应的值
          while (en.MoveNext())
          {string str = en.Value.ToString(); }
     6.对哈希表进行排序
       对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:
         ArrayList akeys=new ArrayList(ht.Key); //别忘了导入System.Collections
         akeys.Sort(); //按字母顺序进行排序
         for(string skey in akeys)
       {
          Console.Write(skey + ":");
          Console.WriteLine(ht[skey]);//排序后输出
       }
     //hashtable的排序第一种方法,按照键的大小排序  
    ArrayList al = new ArrayList(ht.Keys);  
    al.Sort();  
    al.Reverse(); //反向排序  
    foreach (string str in al)  
    {  Console.WriteLine(str + "  " + ht[str]);  }  
    Console.WriteLine("++++++++++++++++++++++++++");
    //hashtable的排序第二种方法,按照值的大小排序  
    ArrayList alv = new ArrayList(ht.Values);  
    alv.Sort();  
    foreach (string str in alv)  
    {  
        IDictionaryEnumerator enumerator2 = sl.GetEnumerator();  
        while (enumerator2.MoveNext())  
        {  
            if (str.Equals(enumerator2.Value.ToString()))  
            {    Console.WriteLine(enumerator2.Key + ":" + enumerator2.Value);}  
        }        
    }  
    Console.WriteLine("++++++++++++++++++++++++++");  
    //hashtable的排序第三种方法,用SortedList代替hashtable  
    SortedList sl = new SortedList();  
    sl.Add("a", "a1");  
    sl.Add("c", "c1");  
    sl.Add("b", "b1");  
    IDictionaryEnumerator enumerator1 = sl.GetEnumerator();  
    while (enumerator1.MoveNext())  
    {  
        Console.WriteLine(enumerator1.Key);  
        Console.WriteLine(enumerator1.Value);  
    }   
}  
  


   7.Hashtable和HashMap的区别
  HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。  
      1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。 
      2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。 
      3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。 
      4.HashTable使用Enumeration,HashMap使用Iterator。 以上只是表面的不同,它们的实现也有很大的不同。 
      5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是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); 

    以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如HashMap对null的操作
Hashtable和HashMap的区别: 
1.Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类; 
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是Java1.2引进的Map interface的一个实现 
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许 
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。 
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在 
多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 

就必须为之提供外同步。    

class Program
    {
        static void Main(string[] args)
        {
            // 创建一个Hashtable实例
            Hashtable ht=new Hashtable(); 
 
            // 添加keyvalue键值对
            ht.Add("A","1");
            ht.Add("B","2");
            ht.Add("C","3");
            ht.Add("D","4");
 
            // 遍历哈希表
            foreach (DictionaryEntry de in ht)
            {
                Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
            }
 
            // 哈希表排序
            ArrayList akeys=new ArrayList(ht.Keys); 
            akeys.Sort();
            foreach (string skey in akeys) 
            {
                Console.WriteLine("{0, -15} {1, -15}", skey, ht[skey]);
 
            }
 
            // 判断哈希表是否包含特定键,其返回值为true或false
            if (ht.Contains("A"))
              Console.WriteLine(ht["A"]);
             
            // 给对应的键赋值
            ht["A"] ="你好";
 
            // 移除一个keyvalue键值对
            ht.Remove("C");
 
            // 遍历哈希表
            foreach (DictionaryEntry de in ht)
            {
                Console.WriteLine("Key -- {0}; Value --{1}.", de.Key, de.Value);
            }
        
            // 移除所有元素
            ht.Clear();
   
            // 此处将不会有任何输出
            Console.WriteLine(ht["A"]);
            Console.ReadKey();
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值