文章目錄
- 一、前言🚀🚀🚀
- 二、Java 基礎面試題:??????
- 1、說說 Java 中 HashMap 的原理?
- 2、HashMap 的擴容機制?
- 3、為什么 Java 中 HashMap 的默認負載因子是 0.75?
- 4、JDK 1.8 對 HashMap 除了紅黑樹還進行了哪些改動?
- 5、Java 中 ConcurrentHashMap 1.7 和 1.8 之間有哪些區別?
- 6、數組和鏈表在 Java 中的區別是什么?
- 后序還在更新中~~~
- 三、總結:🍓🍓🍓
一、前言🚀🚀🚀
??
你每一天的努力會在未來的某一個點交匯成宏偉的畫面。
本文簡介:本人是大二軟件工程專業,java后端方向,學習路線:java基礎->JDBC->Maven->MyBatis->SSM,通過做筆記分享到博客上的形式,激勵自己學習,同時方便復習。由于水平為入門級別,如有錯誤,希望大佬們評論或私信斧正 Thanks?(・ω・))ノ
二、Java 基礎面試題:??????
1、說說 Java 中 HashMap 的原理?
??HashMap 是基于哈希表的數據結構,用于存儲鍵值對(key-value)。其核心是將鍵的哈希值映射到數組索引位置,通過數組 + 鏈表(在 Java 8 及之后是數組 + 鏈表 + 紅黑樹)來處理哈希沖突。
??HashMap 使用鍵的 hashCode() 方法計算哈希值,并通過 indexFor 方法(JDK 1.7 及之后版本移除了這個方法,直接使用 (n - 1) & hash)確定元素在數組中的存儲位置。哈希值是經過一定擾動處理的,防止哈希值分布不均勻,從而減少沖突。
HashMap 的默認初始容量為 16,負載因子為 0.75。也就是說,當存儲的元素數量超過 16 × 0.75 = 12 個時,HashMap 會觸發擴容操作,容量x2并重新分配元素位置。這種擴容是比較耗時的操作,頻繁擴容會影響性能。
2、HashMap 的擴容機制?
??HashMap 的默認初始容量為 16,負載因子為 0.75。也就是說,當存儲的元素數量超過 16 × 0.75 = 12 個時,HashMap 會觸發擴容操作,容量x2并重新分配元素位置。
??擴容時,Hashmap需要重新計算所有元素的哈希值,并將它們重新分配到新的哈希桶中,這個過程稱為rehashing。每個元素的存儲位置會根據新容量的大小重新計算哈希值,并移動到新的數組中。
??這種擴容是比較耗時的操作,頻繁擴容會影響性能。
3、為什么 Java 中 HashMap 的默認負載因子是 0.75?
??是為了在時間復雜度和空間復雜度之間取得一個合理的平衡,負載因子為 0.75 時,避免過多擴容的同時,也保證了不會出現過多的哈希沖突,
??確保查找和插入操作的效率,維持良好的性能表現。
4、JDK 1.8 對 HashMap 除了紅黑樹還進行了哪些改動?
??改進了哈希函數的計算:JDK 1.8 中優化了哈希函數,使得哈希值的分布更加均勻,減少了哈希沖突的發生,通過在生成哈希值時使用“擾動函數”,確保哈希值的高低位都能參與到桶的選擇中。
??擴容機制優化:JDK 1.8 改進了擴容時的元素遷移機制。在擴容過程中不再對每個元素重新計算哈希值,而是根據原數組長度的高位來判斷元素是留在原位置,還是遷移到新數組中的新位置。這一改動減少了不必要的計算,提升了擴容效率。
??頭插法變為尾插法:頭插法的好處就是插入的時候不需要遍歷鏈表,直接替換成頭結點,但是缺點是擴容的時候會逆序,而逆序在多線程操作下可能會出現環,產生死循環,于是改為尾插法。
5、Java 中 ConcurrentHashMap 1.7 和 1.8 之間有哪些區別?
??JDK 1.7 ConcurrentHashMap 采用的是分段鎖,即每個 Segment 是獨立的,可以并發訪問不同的 Segment,默認是 16 個 Segment,所以最多有 16 個線程可以并發執行。
??而 JDK 1.8 移除了 Segment,鎖的粒度變得更加細化,鎖只在鏈表或紅黑樹的節點級別上進行。通過 CAS 進行插入操作,只有在更新鏈表或紅黑樹時才使用 synchronized,并且只鎖住鏈表或樹的頭節點,進一步減少了鎖的競爭,并發度大大增加。
并且 JDK 1.7 ConcurrentHashMap 只使用了數組 + 鏈表的結構,而 JDK 1.8 和 HashMap一樣引入了紅黑樹。
??除此之外,還有擴容的區別以及 size 方法的計算也不一樣。
6、數組和鏈表在 Java 中的區別是什么?
??1、數組是內存中連續的空間,而鏈表可以不連續
??2、數組長度固定,如果需要擴展數組,需要重新開辟一片空間使用。而鏈表可以直接用指針指向不同的地址,擴展方便。
??3、在讀取多的場景下適合用數組,數組可以直接用下標訪問,而在插入和刪除操作多的場景下適合用鏈表4、鏈表需要額外的空間存儲指針,占用的空間會比數組更多。
??
??
??
??
????
??
??
??
??
后序還在更新中~~~
三、總結:🍓🍓🍓
提示:這里對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數據的函數和方法。