为什么不同布尔实例的哈希码始终相同?

时间:2014-03-27 09:43:16

标签: java boolean hashcode

在下面的代码中,哈希码总是相同的。为什么会那样?

代码:

public class BooleanClass {

    public static void main(String[] args) {
        Boolean b1 = new Boolean(true);
        Boolean b2 = new Boolean(false);
        Boolean b3 = new Boolean(true);
        Boolean b4 = new Boolean(false);
        Boolean b5 = new Boolean(false);
        Boolean b6 = new Boolean(true);

        System.out.println(b1.hashCode());
        System.out.println(b2.hashCode());
        System.out.println(b3.hashCode());
        System.out.println(b4.hashCode());
        System.out.println(b5.hashCode());
        System.out.println(b6.hashCode());
    }
}

输出:

1231
1237
1231
1237
1237
1231

始终打印相同的数字12311237。有什么原因吗?

6 个答案:

答案 0 :(得分:158)

Boolean.hashCode()方法的

The JavaDoc说:

  

如果此对象表示1231,则返回整数true;如果此对象表示1237,则返回整数false

答案 1 :(得分:51)

hashCode()的合约是:

  

如果两个对象根据equals(Object)方法相等,则在两个对象中的每一个上调用hashCode()方法必须产生相同的整数结果。

虽然布尔值只有两个值truefalse,但只能得到两个不同的哈希码。

答案 2 :(得分:20)

直接来自布尔类:

 public int hashCode()
 {
   return ((this.value) ? 1231 : 1237);
 }

这是为布尔类型生成哈希码的方法。这就是为什么你总是得到相同的哈希码为真或假。

这是布尔

的构造函数
 public Boolean(boolean paramBoolean)
 {
   this.value = paramBoolean;
 }

所以this.value将为true或false如果为true则将给出1231,如果为false则将给出1237

答案 3 :(得分:11)

散列函数的要点是将任意长度的数据映射到固定长度的数据。哈希函数返回的值称为哈希值,哈希码,哈希值,校验和或简单哈希值。如果输入相同,散列函数将始终返回完全相同的散列,因此散列true将始终等于1231并且散列false将始终等于1237

答案 4 :(得分:5)

如果你真的需要区分实例而不是值 - 这很少是你真正想要的,但偶尔会发生 - 请参阅IdentityHashMap

(基本上,IdentityHashMap会绕过对象“真实”类中的.equals().hashcode()实现,并使用来自Object的实现。)

答案 5 :(得分:3)

我不明白为什么这个问题引起了如此多的关注。如果不是这样,我会感到惊讶。由于其他人很好地指出,它甚至在documentation中指定。

但即使没有文档,也很容易理解原因:您只需检查哈希函数function的定义。

  

哈希函数是将任意长度的数据映射到的任何算法   固定长度的数据。

来自mathematical definition map是一个函数,这意味着相同的值将始终产生相同的值。

如果这无济于事,你可以看一下这个例子:

 int a = 400;
 int b = 400;

您是否应该预期哈希会有所不同?很可能没有。那么为什么在真假的情况下它们会有所不同呢?