hashCode相關效能優化

2021-08-11 16:59:25 字數 1379 閱讀 8487

學習下hashmap中用到的關於hashcode效能優化技巧,作為筆記,為之後併發深入作基礎。

1.關於提高效能的hash演算法

在被模的位數為2的n次方時,用位與代替效率低下的模運算。位與效率相比模運算效率更高。

例:15%4=3,代替為 15 & 3=1111 & 0011=0011=3

hashmap中在求得某個key後,需要找到在哪個entry陣列下標的運算如下:

static int indexfor(int h, int length)

例:兩個key,呼叫object的hash方法後值分別為:

32,64,然後entry陣列大小為:16,即在呼叫indexfor時引數分別為[32,15],[64,15],

這時分別對它們呼叫indexfor方法:

32計算過程:

100000 & 1111 =>  000000 =>0

64計算過程如下:

1000000 & 1111 =>  000000 =>0

可以看到indexfor在entry陣列大小不是很大時只會對低位進行與運算操作,高位值不參與運算(如果entry大小為32,則只會與低5位進行與操作),很容易發生hash衝突。

這裡,32與64這兩個hash值,都被儲存在entry陣列0的位置上。

為了解決這個問題,hashmap在做indexfor操作前,需要呼叫hash方法,使hash值的位值在高低位上盡量分布均勻,hash方法:

static int hash(int h)

還是按前面的key,經過object的hash方法後,分別為32,64來進行運算:

32呼叫hash運算過程如下:

原始h為32的二進位制:

100000

h>>>20:  

000000

h>>>12:

000000

接著運算 h^(h>>>20)^(h>>>12):

結果:    100000

然後運算: h^(h>>>7)^(h>>>4),

過程如下:

h>>>7:    000000

h>>>4:    000010

最後運算: h^(h>>>7)^(h>>>4),

結果:    100010,即十進位制34

呼叫indexfor方法:

100010 & 1111 => 2,即存放在entry陣列下標2的位置上

------------------------------------

64的運算結果為:1000100,十進位制值為68

呼叫indexfor方法:

1000100 & 1111 => 4,即存放在entry陣列下標4的位置上

可以看到經過hash方法後,再呼叫indexfor方法,這樣可以減少衝突。 

hashCode相關效能優化

學習下hashmap中用到的關於hashcode效能優化技巧,作為筆記,為之後併發深入作基礎。1.關於提高效能的hash演算法 在被模的位數為2的n次方時,用位與代替效率低下的模運算。位與效率相比模運算效率更高。例 15 4 3,代替為 15 3 1111 0011 0011 3 hashmap中在...

前端相關 效能優化

盡量使用字型圖示或者svg圖示,需要使用時,格式盡可能使用webp 保證質量的情況下把體積壓縮到最小 體積比較小的 10k以下的樣子 轉化成 webp 反而體積變大了,小圖就可以使用base64。使用base64 正常方式載入,需要經歷 請求 編碼 渲染三個步驟,而每個步驟都需要一些時間,而base...

速率相關效能指標

速率即資料率或稱資料傳輸率或位元率。位元 1 0位元 連線在計算機網路上的主機在數字通道上傳送資料位數的速率 頻寬 原本是指某個訊號具有的頻頻寬度,即最高頻率與最低頻率之差,單位是赫茲 2 計算機網路上,頻寬用來表示網路的通訊線路傳送資料的能力,通常是指單位時間內從網路中的某一點到另一點所能通過的 ...