JAVA開發之hashMap時間複雜(zá)度分析

發布時間:2022-08-24 14:40:44 作者:King 來源:本站 浏覽量(1111) 點贊(56)
摘要:HashMap容器O(1)的查找時間複雜(zá)度隻是(shì)其理想的狀态,而這種理想狀态需要由java設計者去(qù)保證。在由設計者保證了鏈表長度盡可能短的前提下,由于利用了數組結構,使得key的查找在O(1)時間内完成。可以将 HashMap分成兩部分來看待,hash和map。map隻是(shì)實現(xiàn)了鍵值對的存儲。而其整個O(1)的查找複雜(zá)度很大程度上是(shì)由hash來保證的

HashMap容器O(1)的查找時間複雜(zá)度隻是(shì)其理想的狀态,而這種理想狀态需要由java設計者去(qù)保證。

在由設計者保證了鏈表長度盡可能短的前提下,由于利用了數組結構,使得key的查找在O(1)時間内完成。

可以将 HashMap分成兩部分來看待,hash和map。map隻是(shì)實現(xiàn)了鍵值對的存儲。而其整個O(1)的查找複雜(zá)度很大程度上是(shì)由hash來保證的。

HashMap對hash的使用體現(xiàn)出一些設計哲學,如:通過key.hashCode()将普通的object對象轉換爲int值,從而可以将其視爲數組下标,利用數組O(1)的查找性能。


OK,下面我們來看看HashMap中新增元素的時間複雜(zá)度。

put操作的流程:

第一步:key.hashcode(),時間複雜(zá)度O(1)。

第二步:找到桶以後,判斷桶裏是(shì)否有元素,如果沒有,直接new一個entey節點插入到數組中。時間複雜(zá)度O(1)。

第三步:如果桶裏有元素,并且元素個數小于6,則調用equals方法,比較是(shì)否存在相(xiàng)同名字的key,不存在則new一個entry插入都鏈表尾部。時間複雜(zá)度O(1)+O(n)=O(n)。

第四步:如果桶裏有元素,并且元素個數大于6,則調用equals方法,比較是(shì)否存在相(xiàng)同名字的key,不存在則new一個entry插入都鏈表尾部。時間複雜(zá)度O(1)+O(logn)=O(logn)。紅黑樹(shù)查詢的時間複雜(zá)度是(shì)logn。

通過上面的分析,我們可以得出結論,HashMap新增元素的時間複雜(zá)度是(shì)不固定的,可能的值有O(1)、O(logn)、O(n)。

二,hash碰撞問題

HashMap在put元素時,首先會計算key的hashcode,這時候不會去(qù)調用equals方法。爲什麽呢?因爲equals方法的時間複雜(zá)度是(shì)O(n)。但(dàn)是(shì)HashMap存在hash碰撞問題,最壞的情況下,所有的key都被分配到了同一個桶,這時map的put和get時間複雜(zá)度都是(shì)O(n)。

所以HashMap的設計者必須要考慮的一個問題就是(shì)減少hash碰撞。

HashMap解決哈希沖突采用的是(shì)哪種方式呢?

答:HashMap解決哈希沖突采用的是(shì)鏈地址法。說白了就是(shì)把沖突的key連接起來,放(fàng)到桶裏。當桶中的元素個數不超過6個時,以單鏈表的形式串起來,當桶中的元素個數超過6個時,以紅黑樹(shù)的形式串起來。

 

過上面的分析,我們可以得出結論,HashMap的hash操作的時間複雜(zá)度是(shì)O(1),HashMap的equals操作的時間複雜(zá)度是(shì)O(n)。

如您有微信小程序開發、外賣、社區團購、分銷商城、分銷系統、量身定制開發、原生android定制、opencv人臉識别項目、網站建設等業務,可聯系閃端,專業團隊爲您排優解難!


微信

掃一掃,關注我們

感興趣嗎(ma)?

歡迎聯系我們,我們願意爲您解答任何有關網站疑難問題!

【如有開發需求】那就聯系我們吧

搜索千萬次不如咨詢1次

承接:網站建設,手機網站,響應式網站,小程序開發,原生android開發等業務

立即咨詢 16605125102