關於HashMap和Hashtable的區別

渣渣演發表於2016-04-06

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的指數。

相關文章