Java-Hashcode相關問題

1.Hashcode和equals的區別?

   Hashcode如果相等的情況下,對象的值不一定相等。equals比較對象的內容相同,hashcode一定相等。

2.爲什麼重寫equals一定要重寫hashcode?

因爲遵循hashcode相等的情況下對象的值不一定相等。equals比較對象的內容相同,hashcode一定相等的原則,所以重寫equals一定要重寫hashcode保證原則不變。

3.HashMap和HashTable的區別?

  1)線程安全上:HashMap是線程不安全的,HashTable被Synchronize修飾,所以線程安全

  2)數據存儲:HashMap運行數據的key爲null,存放在數組的第0個位置。HashTable不允許數據爲null,會拋出異常。

4.HashMap的put是如何實現的?
(1)計算key的hashCode
(2)將key的hashCode作爲計算因子,通過哈希算法計算HashMap的數組下標index
(3)如果index下標的數組元素爲空,直接put(新增元素)
(4)如果index下標的數組元素不爲空,調用key的equal方法,判斷index位置的鏈表是否存在
(5)如果找到鏈表中某個元素與key的equals方法相等,則使用value更新
(6)如果未找到鏈表中某個元素與key的equals方法相等,則新增
一般面試的時

候,經常會問到HashMap的原理。起初一直不理解,搞清楚HashMap的原理很重要嗎?我就知道HashMap是線程不安全的。後來仔細看了下HashMap的底層實現原理,
原來HashMap既具有數組的快速查詢,又兼具鏈表的快速插入特性。雖然不是線程安全的,但通過線程安全處理之後,無論是查詢還是添加元素都很高效,用途廣泛,因此掌握HashMap的底層原理的重要性不言而喻了。

5.如何理解hashcode的碰撞問題和解決方法?

對象值可能不等但是hashcode可能相等,即碰撞,如下圖的例子中

		String value1="a";
		Integer value2=97;
		System.out.println(value1.hashCode());
		System.out.println(value2.hashCode());
		System.out.println(value1.hashCode()==value2.hashCode());//結果爲true

將所有關鍵字爲同義詞的記錄存儲在同一線性鏈表中。如下:

7.JDK1.8爲什麼引入紅黑樹?

Hashmap1.7採用數組+鏈表實現,採用HashEntry封裝我們的鍵值對,Hashmap根據key查詢沒有衝突的情況下,時間複雜度爲O(1),但是有衝突時時間複雜度爲O(n),所以JDK1.8中,鏈表長度大於8,並且數組長度是64的情況下轉爲紅黑樹存放。

8.加載因子爲什麼是0.75不是其他?

Hashmap中jdk1.7的默認數組長度爲16,加載因子爲0.75,即當16x0.75=12時候開始擴容,擴容爲原來的2倍(16x2=32)

如果加載因子太小,key的衝突概率會小,但是浪費內存空間

如果加載因子太大,key的衝突概率會大,但是利用的空間非常好

綜上所述,空間利用率高,衝突概率低的情況下,取平衡值0.75

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章