| 企服解答
hashmap1.7和1.8的區別:1、JDK1.7用的是頭插法,而JDK1.8及之后使用的都是尾插法;2、擴容后數據存儲位置的計算方式也不一樣;3、JDK1.7的時候使用的是數組+ 單鏈表的數據結構。
hashmap1.7和1.8的區別
1、JDK1.7用的是頭插法,而JDK1.8及之后使用的都是尾插法
因為JDK1.7是用單鏈表進行的縱向延伸,當采用頭插法時會容易出現逆序且環形鏈表死循環問題。但是在JDK1.8之后是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鏈表死循環的問題。
2、擴容后數據存儲位置的計算方式也不一樣
在JDK1.7的時候是直接用hash值和需要擴容的二進制數進行&(這里就是為什么擴容的時候為啥一定必須是2的多少次冪的原因所在,因為如果只有2的n次冪的情況時最后一位二進制數才一定是1,這樣能最大程度減少hash碰撞)(hash值 & length-1)
3、JDK1.7的時候使用的是數組+ 單鏈表的數據結構
在JDK1.8及之后時,使用的是數組+鏈表+紅黑樹的數據結構(當鏈表的深度達到8的時候,也就是默認閾值,就會自動擴容把鏈表轉成紅黑樹的數據結構來把時間復雜度從O(n)變成O(logN)提高了效率)
| 拓展閱讀
hashmap和hashtable的區別是什么?
1、歷史原因不同。Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現。
2、也許最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。這就意味著,雖然你可以不用采取任何特殊的行為就可以在一個多線程的應用程序中用一個Hashtable,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類的靜態的synchronizedMap(方法,它創建一個線程安全的Map對象,并把它作為一個封裝的對象來返回。這個對象的方法可以讓你同步訪問潛在的HashMap。這么做的結果就是當你不需要同步時,你不能切斷Hashtable中的同步(比如在一個單線程的應用程序中),而且同步增加了很多處理費用。
3、只有HashMap可以讓你將空值作為一個表的條目的key或value。HashMap中只有一條記錄可以是一個空的key,但任意數量的條目可以是空的value。這就是說,如果在表中沒有發現搜索鍵,或者如果發現了搜索鍵,但它是一個空的值,那么get()將返回null。如果有必要,用containKey(方法來區別這兩種情況。
[免責聲明]
文章標題: hashmap1.7和1.8的區別
文章內容為網站編輯整理發布,僅供學習與參考,不代表本網站贊同其觀點和對其真實性負責。如涉及作品內容、版權和其它問題,請及時溝通。發送郵件至36dianping@36kr.com,我們會在3個工作日內處理。