{eval=Array;=+count(Array);}

国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

問答專欄Q & A COLUMN

java面試都問知不知道hashmap的原理,那我就想問,知道原理有什么用?

DirtyMindDirtyMind 回答0 收藏1
問題描述:說實話,對java的集合了解到什么程度,算是合格,即便是大牛中的大牛,大神中的大神,知道集合原理有什么好處,難道說,要重寫java的集合,自己寫個性能更好的么?
收藏問題

2條回答

codercao

codercao

回答于2022-06-28 15:51

Java中的HashMap可以說是平時開發中最常用的數據結構之一了,經常使用的集合類還有ArrayList、HashSet,基本上用好HashMap、ArrayList、HashSet這三大集合類,大多數的業務場景就滿足了,掌握這三大集合類也是作為一名Java程序員的基礎能力。

平時開發大多數的業務場景都是CRUD,且數據量都很小,所以基本上不會有什么問題。那么還需要知道其底層實現原理嗎?還需要知道這些集合類的數據結構嗎?

當然需要,這很重要!這里就拿HashMap來具體說一說了解它的設計思想多么的重要!

HashMap的數據結構

HashMap的底層數據結構簡單來說就是數組+鏈表+紅黑樹,這個大家都知道,面試也是高頻面試題,用一張圖來形容就是:


那這個時候你就得知道數組的好處了,基于下標的隨機訪問和賦值數組元素的時間復雜度都是O(1),這就能保證HashMap數據沒有哈希沖突的時候它的set/put方法都是O(1)的,這也是HashMap要追求的極致目標(盡管會有哈希沖突)。這就是HashMap查詢性能快、插入數據快的主要原因,是一個空間換時間的思想。

哈希

但前提是我們得知道我們要把一個數據插入到數組的哪個下標,因此就采用了哈希的思想。一個對象一定有一個唯一的hash值,但是兩個對象也有可能有相同的hash值,這叫“哈希沖突”。所以為了更好的利用數組,哈希值計算要盡可能的避免沖突,也就是追求“低碰撞率”。

這也涉及到另外一個問題,比較一個對象的時候為什么要重寫它的hashcode()方法和equals()方法。


那業內除了Java自帶的Hashcode()方法還有哪些hash算法你了解嗎?比如MurmurHash算法。他們都在哪些開源軟件中應用到?各種哈希算法的性能比較又如何?我們平時開發能不能借鑒這種思想?


數組與鏈表

當哈希沖突的時候,HashMap就會使用到鏈表,即數組+鏈表,那你知道數組和鏈表的區別嗎?LinkedHashMap和HashMap的區別呢?都適合在哪些場景用到?如果讓你手寫一個LRU緩存,你會怎么寫?

你可能想說我不需要知道數組和鏈表的數據結構,我也沒有手寫LRU緩存的場景,我只想做一條安靜的咸魚,簡簡單單CRUD就好。

高效查找

大家都說平時開發都是CRUD,那你知道如何把CRUD寫的高大上一點嗎?比如其中的C(查詢)應該是最為頻繁的。學過數據結構的都知道,高效查找主要的兩種算法:有序查找(二分)和哈希查找。HashMap的數組就是用到了哈希查找,時間復雜度是O(1),那么你理解了HashMap的原理是不是就基本掌握了哈希查找算法的原理?另外當哈希沖突導致鏈表節點數量達到8時候,就會變成紅黑樹,紅黑樹就是有序查找的變種。如果你又進一步掌握了紅黑樹的查找原理,是不是就基本掌握了有序查找算法的原理?所以HashMap的原理重不重要?掌握了HashMap的原理是不是就掌握了高效查找的方法?如果你沒掌握這些原理,你覺得掌握了沒有用,但是當你掌握了,在日常業務開發中你會發現受用無窮。


HashMap中還有很多思想值得大家學習,掌握這些思想后,其實才是你編程能力的質的提升。手里有武器不用和手里沒有武器不是一回事

評論0 贊同0
  •  加載中...
HitenDev

HitenDev

回答于2022-06-28 15:51

我覺得底層他更多的是思想,理解思想有利于更快的學習其他知識,另一個對于排錯也會有容易一些!

評論0 贊同0
  •  加載中...

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關注的人
向幫助了您的網友說句感謝的話吧!
付費偷看金額在0.1-10元之間
<