2012-02-17 62 views
7

它出現在java.lang.String.java中,Java將只生成哈希碼,然後在調用hashcode()之後將其存儲,但爲什麼不直接在構造函數中創建哈希碼?爲什麼懶惰生成Java String哈希碼?

相關的代碼:

if (h == 0 && count > 0) { 
    int off = offset; 
    char val[] = value; 
    int len = count; 

    for (int i = 0; i < len; i++) { 
     h = 31*h + val[off++]; 
    } 

    hash = h; 
} 

可能大部分被放置在構造函數中。

+0

如果您發現一個可以接受的答案,您可以勾選它讓人們知道您有問題的答案。 – 2012-02-17 08:34:12

回答

13

爲什麼花時間生成最有可能不會被使用的哈希碼?大多數字符串被構造,使用,然後在沒有調用hashcode()的情況下進行垃圾收集。

+0

許多字符串將在其生命週期中得到相等性檢查。如果兩個不相等的字符串的哈希碼已經被計算出來,那麼檢查兩個不相等的字符串通常非常快此外,對於一些哈希碼實現(包括Java中的哈希碼實現),可以計算兩個字符串在恆定時間(實際上是時間O(lgN))串聯的哈希碼,但是該數量是有界的,並且常數項可能相當小)。 – supercat 2012-11-12 21:56:24

0

這不是真正的論壇,這個問題可能會被關閉。您可以嘗試在程序員.stackexchange.com中提問。

其中一個原因可能是計算hashCode並不便宜,只有在某些情況下才需要。

4

喬舒亞布洛赫稱這種做法'活潑的單一檢查'。

傑里米·曼森有它爲什麼做了出色的解釋,爲什麼it'safe:on his blog

從本質上說,在施工時間,你跳過來計算哈希碼節省一些時間。在多線程環境中,您將爲此付費,因爲多個線程可能會執行相同的計算。

0

2個原因:

1)計算hashCode()不便宜:是對字符串的長度O(n)複雜,當需要它,這樣做的更好而已。

和:

2)String實例是不可變的:因爲他們永遠不會改變,你總是計算hashCode()最多一次。

0

將它放在構造函數中沒有任何好處。但是當它在構造函數中時會有一個缺點。當一個字符串的hashCode永遠不會被調用,那麼計算就沒有了。而當你調用hashCode()時,它會在兩種情況下計算一次 - 只是在不同的地方和時間。