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

use*_*951 34 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

1231
1237
1231
1237
1237
1231
Run Code Online (Sandbox Code Playgroud)

始终使用相同的数字12311237打印.任何原因?

Gok*_* KP 159

JavaDoc中Boolean.hashCode()方法,说:

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

  • @WhoAmI:查看[此答案](http://stackoverflow.com/a/3912325/1343161)获取解释. (21认同)
  • 如果你将它添加到你的答案中,那将是最好的答案:"如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode()方法必须产生相同的整数结果. " (19认同)
  • 总结[Keppil链接到的答案](http://stackoverflow.com/questions/3912303/boolean-hashcode/3912325#3912325):1231和1237只是两个任意素数,目标是减少hashsets中的冲突/包含HashMap. (8认同)

Har*_*ezz 51

hashCode()的合同是:

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

虽然布尔值只有两个值,true并且false只得到两个不同的哈希码.


She*_*nar 20

直接来自布尔类:

 public int hashCode()
 {
   return ((this.value) ? 1231 : 1237);
 }
Run Code Online (Sandbox Code Playgroud)

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

这是布尔的构造函数

 public Boolean(boolean paramBoolean)
 {
   this.value = paramBoolean;
 }
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*rts 11

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


kes*_*lam 5

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

(基本上,IdentityHashMap绕过对象的"真实"类中的.equals().hashcode()实现,并使用它们Object.)