2014-12-03 54 views
2

假設我們有一個如下瑣碎類:我應該使用什麼作爲null的哈希碼?

public class Foo { 

    public Integer bar; 

} 

我們希望能夠建立其一個「好」 hashCode方法。舉例來說,我認爲「好」是指在「真實生活」的情況下發生散列碼衝突的可能性很小。

在「現實生活」這樣一類我會合理地期望Foo s的bar設置爲null0。我甚至會爭辯說,這兩個可能是最常見的值。

但讓我們來看看什麼樣的Eclipse,例如,產生:

public class Foo { 

    public Integer bar; 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((bar == null) ? 0 : bar.hashCode()); 
     return result; 
    } 
} 

而且它不只是Eclipse的,好像用0作爲hashCodenull是正常的做法。

但是這會產生相同的散列碼null0,不是嗎?因爲我假設null0可能是最常見的情況 - 這導致更高的collission可能性。

所以這裏來了我的問題。 null的值是多少hashCode

+0

a負值? – 2014-12-03 10:13:38

+0

@SarthakMittal哪一個? – lexicore 2014-12-03 10:43:03

+0

你的bar.hashCode()可以返回負值嗎?如果不是,那麼任何負值就足夠了否則我會建議使用Integer.MIN_VALUE :) – 2014-12-03 11:16:57

回答

1

從約書亞Bloch的優秀著作有效的Java,第二版(第49頁):

如果該字段的值是null,返回0(或其他一些不變的,但0是傳統) 。

所以你可以使用你選擇的任何恆定的,但通常,0被用作null哈希碼。

在你的情況下,如果頻繁出現0,最好選擇一個不同於0的常量(在你的字段中不會顯示爲有效值)以避免衝突。

+0

我知道這是傳統的,總是自己做。但是現在我質疑這個傳統。 – lexicore 2014-12-03 10:32:44

1

找到一個不常出現的常數可能會很困難。您可以使用negative constant以避免與null發生衝突。

1

堅持任何Eclipse產生,或0

如果測試或性能分析顯示更改哈希碼爲空可以提高性能,那就去做吧。將其更改爲任何arbritrary常量。

+0

我們正在編寫一個創建'hashCode'的代碼生成器。在生成的類中。 – lexicore 2014-12-03 11:09:52

+0

我明白了!那麼,'0'對我來說似乎很好。如果你真的想避免這個非常簡單的示例類的衝突,唯一的另一種選擇是選擇除0以外的數字。KISS。保持簡單直到你有充分的理由不要。 – Zantier 2014-12-03 11:17:07

相關問題