您好,登錄后才能下訂單哦!
HashMap和Hashtable有什么不同,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
線程安全
兩者最主要的區別在于Hashtable是線程安全,而HashMap則非線程安全。Hashtable的實現方法里面都添加了synchronized關鍵字來確保線程同步,因此相對而言HashMap性能會高一些,我們平時使用時若無特殊需求建議使用HashMap,在多線程環境下若使用HashMap需要使用Collections.synchronizedMap()方法來獲取一個線程安全的集合(Collections.synchronizedMap()實現原理是Collections定義了一個SynchronizedMap的內部類,這個類實現了Map接口,在調用方法時使用synchronized來保證線程同步,當然了實際上操作的還是我們傳入的HashMap實例,簡單的說就是Collections.synchronizedMap()方法幫我們在操作HashMap時自動添加了synchronized來實現線程同步,類似的其它Collections.synchronizedXX方法也是類似原理。
NULL值
HashMap可以使用null作為key,不過建議還是盡量避免這樣使用。HashMap以null作為key時,總是存儲在table數組的第一個節點上。當get()方法返回null 值時,既可以表示HashMap 中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap 中不能用get()方法來判斷HashMap 中是否存在某個鍵,而應該用containsKey()方法來判斷。而Hashtable則不允許null作為key。
繼承關系
HashMap繼承了AbstractMap,HashTable繼承Dictionary抽象類,兩者均實現Map接口。
容量初始值
HashMap的初始容量為16,Hashtable初始容量為11,兩者的填充因子默認都是0.75。
擴容方式
HashMap擴容時是當前容量翻倍即:capacity*2,Hashtable擴容時是容量翻倍+1即:capacity*2+1。
底層結構
HashMap和Hashtable的底層實現都是數組+鏈表結構實現。
哈希算法
Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap計算hash對key的hashcode進行了二次hash,以獲得更好的散列值,然后對table數組長度取摸:
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length-1);
}
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。