关于HashMap和Hashtable的区别

Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable。可能你觉得Hashtable很好用,为什么不用呢?这里简单分析他们的区别。

1.Hashtable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized 关键字,而HashMap的源代码中则连 synchronized 的影子都没有,当然,注释除外。

2.Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以,但是key只能有一个为空)。

3,关于两者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。

/**a test for Hashtable values can or not be null**/
public class Test {
    public static void main(String[]args){
        Hashtable<String,String> table=new Hashtable<String,String>();
        table.put("a-key","a-values");
        table.put("b-key","b-values");
        table.put("c-key","c-values");
        //table.put("d-key",null);//java.lang.NullPointerException
        //System.out.print(table);
        /**用values的方式遍历**/
        Collection zzy=table.values();
        Iterator it=zzy.iterator();
        while(it.hasNext()){
            String obj=(String)it.next();
            System.out.println(obj);
        }
        /**用entrySet的方式遍历**/
        Set set = table.entrySet();  
        Iterator its = set.iterator();  
        while (its.hasNext()) {  
        Entry entry = (Entry) its.next();  
        System.out.println(entry.getKey() + " - " + entry.getValue()); 
        }  
    }
}

/**a test for HashMap values can or not be null**/
public class Test1 {
        public static void main(String[]args){
            HashMap<String,String> table=new HashMap<String,String>();
            table.put("a-key","a-values");
            table.put("b-key","b-values");
            table.put("c-key","c-values");
            table.put(null,null);
            table.put("d-key",null);//java.lang.NullPointerException
            //System.out.print(table);
            /**用values的方式遍历**/
            Collection zzy=table.values();
            Iterator it=zzy.iterator();
            while(it.hasNext()){
                String obj=(String)it.next();
                System.out.println(obj);
            }
            /**用entrySet的方式遍历**/
            Set set = table.entrySet();  
            Iterator its = set.iterator();  
            while (its.hasNext()) {  
            Entry entry = (Entry) its.next();  
            System.out.println(entry.getKey() + " - " + entry.getValue());  
              
            }  
        }
}

4.HashTable使用Enumeration,HashMap使用Iterator

以下这两点是从内部实现机制上来进行比较

5.哈希值的使用不同

6.Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

原文地址:https://www.cnblogs.com/41ZZY/p/5360757.html