2014-12-03 89 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

相关问题