HashMap與HashTable的區別、HashMap與HashSet的關係

HashTable的應用很是普遍,HashMap是新框架中用來代替HashTable的類,也就是說建議使用HashMap,不要使用HashTable。可能你以爲HashTable很好用,爲何不用呢?這裏簡單分析他們的區別。java

1、HashMap與HashTable的區別

  1. HashTable的方法是同步 的,在方法的前面都有synchronized來同步,HashMap未經同步,因此在多線程場合要手動同步
    HashMap這個區別就像Vector和ArrayList同樣。
    能夠經過Map m = Collections.synchronizedMap(new HashMap(...));
    對HashMap進行同步操做。數組

  2. HashTable不容許null值(key和value都不能夠) ,HashMap容許null值(key和value均可以)。安全

  3. HashTable有一個contains(Object value)功能和containsValue(Object value)功能同樣。多線程

  4. HashTable使用Enumeration進行遍歷,HashMap使用Iterator進行遍歷。框架

    HashTable的遍歷:
    Hashtable ht=new Hashtable();
        ht.put("1", "111");
        ht.put("3","333");
        ht.put("2", "222");
        Enumeration en=ht.keys();
        while(en.hasMoreElements()){
            Object key=en.nextElement();
            Object value=ht.get(key);
            System.out.println("key="+key+",value="+value);
        }

    HashMap的遍歷參考:http://blog.csdn.net/wl_ldy/archive/2010/10/13/5939552.aspx.net

    以上只是表面的不一樣,它們的實現也有很大的不一樣。線程

  5. HashTable中hash數組默認大小是11,增長的方式是 old*2+1。HashMap中hash數組的默認大小是16,並且必定是2的指數。code

  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) {blog

      h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
    }
    static int indexFor(int h, int length) {
       return h & (length-1);
    }
    ```
    以上只是一些比較突出的區別。

2、HashMap與HashSet的關係

  1. HashSet底層是採用HashMap實現的:
    public HashSet() { map = new HashMap<E,Object>(); }
  2. 調用HashSet的add方法時,其實是向HashMap中增長了一行(key-value對),該行的key就是向HashSet增長的那個對象,該行的value就是一個Object類型的常量。

    private static final Object PRESENT = new Object();
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
        }
    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
        }

    3、Properties類的特色,是否線程安全?

    java.util.Properties 繼承自 java.util.Hashtable ,因此Properties是線程安全的。 Properties 類表示一個持久的屬性集.Properties 可保存在流中或從流中加載.屬性列表中每一個鍵及其對應值都是一個字符串.

相關文章
相關標籤/搜索