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