HashSet不可以儲存相同元素的原理

2021-10-10 15:20:47 字數 902 閱讀 8103

雜湊表是以陣列加鍊表加紅黑樹來儲存資料的。

當相同雜湊值的元素大於等於8個時(即雜湊衝突的元素超過8個),就會使用紅黑樹來儲存,因為紅黑樹查詢效率很高。

雜湊表的儲存是首先通過雜湊函式來計算雜湊值(hashcode())來確定你要放到雜湊表裡面的哪乙個位置。

這裡有乙個問題是:

兩個元素會出現相同的雜湊值,至於為什麼可以參考其他部落格。

當出現雜湊值相同時,這兩個元素就會放進鍊錶裡面,比如a和b的雜湊值都是95533,a和b就會放進鍊錶裡面。

但是如果資料很多,雜湊表固定,那麼就會造成資料太密集,同時鍊錶就會很長,造成查詢和插入次數多,造成效能下降。

如果增加雜湊表的長度,而要儲存的資料並不多,就會造成空間的浪費。

為了合理解決這個問題,就有了負載因子的概念:

負載因子=填入表中元素/雜湊表的長度

通俗理解負載因子就是告訴雜湊表什麼時候該擴容了。

比如,我們知道初始的hashmap初始容量為16,如果負載因子為1,即16*1=16,等容量完全占用以後才會擴容,那麼就會增加時間查詢成本。

負載因子過高就是第一種情況,造成效能下降;如果負載因子低就會造成空間的浪費,一般來說負載因子為0.75時能效比最大。

這裡最主要的是兩個方法:hashcode()和equals()。

當往裡面儲存元素時,首先會呼叫hashcode()方法,計算雜湊值,然後判斷雜湊表中有沒有這個值,如果沒有那麼直接儲存,如果有,即發生了雜湊衝突,然後再呼叫equals方法判斷所儲存的元素和相同雜湊值的元素是否一樣,如果不同,則將新的也進行儲存,如果相同,則不儲存。

CURL不可以讀寫檔案

最近在學es elastic search 參考裡面翻譯的官方權威指南 後面發現官網已經推出了中文版文件了 裡面有的例子把訪問es的命令做了簡化如下 curl xget localhost 9200 count?pretty d 簡化為 get count 一開始我以為是es報的錯,進es的日誌,發...

觸發器不可以亂用

突然發現有乙個語句 update dnt users set adminid 0 where groupid 7 執行得特別慢,更新的資料是四萬多條記錄,表裡也是有四萬多條記錄。在檢視後發現庫里有乙個觸發器 if exists select name from sysobjects where na...

nyoj 1071 不可以! 水

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 判斷 兩個數x y的正負性。要求 不可以使用比較運算子,即 輸入 有多組資料,每組資料佔一行,每一行兩個數x,y。x y保證在int範圍內。輸出 每組資料輸出佔一行。如果兩個數是一正一負,輸出 signs are opposit...