MapとHashMap,Hashtable,HashSetの違い

5892 ワード

前言:


最近、面接で出会った質問を整理していますが、これらの質問は基本的に注意深く調べないと全く分からないので、他人のブログや、自分自身のテストを参考にして、このブログの内容をまとめました.

HashTableとHashMapの違い


区別1:継承された親の異なるHashtableはDictionaryクラスから継承され、HashMapはAbstractMapクラスから継承されます.しかし、どちらもMapインタフェースを実現した.
public class Hashtable<K,V> extends Dictionary<K,V>  
implements Map<K,V>, Cloneable, Serializable  

public class HashMap<K,V> extends AbstractMap<K,V>  
implements Map<K,V>, Cloneable, Serializable 

違い2:スレッドのセキュリティが異なるHashtableではSynchronizeが使用され、HashMapではデフォルトではSynchronizeが使用されません.
違い3:containsメソッドを提供するかどうかHashMapはHashtableのcontainsメソッドを削除し、containsValueとcontainsKeyに変更した.containsメソッドは誤解を招きやすいからだ.Hashtableはcontains,containsValue,containsKeyの3つのメソッドを保持し,containsとcontainsValueの機能は同じである.
**区別4:**keyとvalue null値がkeyとvalueがオブジェクトであり、重複keyは含まれませんが、重複valueは含まれます.Hashtableではkeyもvalueもnull値を許可しません.HashMapではnullをキーとすることができ、このようなキーは1つしかありません.1つ以上のキーに対応する値nullを指定できます.get()メソッドがnull値を返すと、HashMapにキーがないか、キーに対応する値がnullになる可能性があります.したがって,HashMapではget()メソッドでHashMapにキーが存在するか否かを判断することはできず,containsKey()メソッドで判断すべきである.PS:この面接は聞くのが好きです.
違い5:ハッシュ値の計算方法は異なり、HashtableはオブジェクトのhashCodeを直接使用し、HashMapはオブジェクトのhashCodeに基づいていくつかの変化を行った.
//Hashtable hashcode 
    int hash = key.hashCode();
    // ,  
    int index = (hash & 0x7FFFFFFF) % tab.length;
//HashMap 
   // hashcode,       
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    static int hash(int h) {
     // This function ensures that hashCodes that differ only by
     // constant multiples at each bit position have a bounded
     // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
   // 
    static int indexFor(int h, int length) {
        return h & (length-1);
    }

違い6:内部実装で使用する配列初期化と拡張方式が異なり、メモリ初期サイズが異なり、HashTable初期サイズは11であり、HashMap初期サイズは16である
     public Hashtable() {
                // , 11,
                // 11 11 , 11        Entry, Entry 
                // 
                // 0.75 
                this(11, 0.75f);
     }
    public HashMap() {
        // 0.75
         this.loadFactor = DEFAULT_LOAD_FACTOR;
        // 0.75*16
        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
        // , 16
        table = new Entry[DEFAULT_INITIAL_CAPACITY];
        init();
    }

Hashtableは2*old+1、HashMapは2*old

HashMapとHashSetの違い


HashSet実質
(1)HashSetはsetの実装クラスである、hashMapはMapの実装クラスであり、hashMapはhashTableの代替品である(なぜ後述).(2)HashSetはオブジェクトを要素とする、HashMapは(key-value)のオブジェクトのセットを要素とし、HashSetは重複するオブジェクトを受け入れることを拒否する.HashMapは、keyのSet,valueのCollection,EntryのSetの3つのビューと見なすことができる.ここでHashSetは、実はHashMapのビューです.HashSet内部はHashmapを用いて実現され,Hashmapとは異なりKeyとValueの2つの値は必要ない.hashsetにオブジェクトを挿入するのは内部だけです
      public boolean add(Object o) {
            return map.put(o, PRESENT)==null;
      }

参考ブログ:1.http://www.cnblogs.com/ywl925/p/3865269.html 2. http://blog.csdn.net/kingzone_2008/article/details/8179701