在下面的代码中,哈希码总是相同的。为什么会那样?
代码:
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
始终打印相同的数字1231
和1237
。有什么原因吗?
答案 0 :(得分:158)
答案 1 :(得分:51)
hashCode()的合约是:
如果两个对象根据
equals(Object)
方法相等,则在两个对象中的每一个上调用hashCode()
方法必须产生相同的整数结果。
虽然布尔值只有两个值true
和false
,但只能得到两个不同的哈希码。
答案 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;
您是否应该预期哈希会有所不同?很可能没有。那么为什么在真假的情况下它们会有所不同呢?