zoukankan      html  css  js  c++  java
  • C#中Hashtable和HashMap的区别很详细;

     C#中Hashtable和HashMap的区别--很详细; 参考自

                                                    http://www.hd1204.com/article/html/1655.html感谢原创;

    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是Java的

       哈希表的简单操作
       在哈希表中添加一个keyvalue键值对:HashtableObject.Add(key,value);
       在哈希表中去除某个keyvalue键值对:HashtableObject.Remove(key);
       从哈希表中移除所有元素:           HashtableObject.Clear();
    判断哈希表是否包含特定键key:      HashtableObject.Contains(key);
    下面控制台程序将包含以上所有操作:

    View Code
    using System;
    using System.Collections; file使用Hashtable时,必须引入这个命名空间
    class hashtable
    {
    public static void Main()
    {
    Hashtable ht
    =new Hashtable(); file创建一个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)) file判断哈希表是否包含特定键,其返回值为true或false
    Console.WriteLine(the E keyexist);
    ht.Remove(C);移除一个keyvalue键值对
    Console.WriteLine(ht[A]);此处输出a
    ht.Clear();移除所有元素
    Console.WriteLine(ht[A]); file此处将不会有任何输出
    }
    }

    //三,遍历哈希表
    //遍历哈希表需要用到DictionaryEntry Object,代码如下:


    for(DictionaryEntry de in ht) fileht为一个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); file别忘了导入System.Collections
    akeys.Sort(); file按字母顺序进行排序
    for(string skey in akeys)
    {
    Console.Write(skey
    + );
    Console.WriteLine(ht[skey]);排序后输出
    }

      

  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/qiliping/p/2121158.html
Copyright © 2011-2022 走看看