【发布时间】:2014-05-06 04:35:41
【问题描述】:
在下面的代码中,哈希码总是相同的。为什么会这样?
代码:
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。有什么原因吗?
【问题讨论】:
-
如果两个对象相等(在 equals 方法的意义上),它们应该(最好必须)也有相同的哈希码。
-
@Seelenvirtuose 来自 Javadoc:如果两个对象根据
equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须 产生相同的整数结果。(强调我的)。所以你的应该太弱了。 -
@BoristheSpider 知道了。 :-) 但事实上,必须并不是严格的技术要求。因此,您可以实现产生不同哈希码的 hashCode 方法(例如 Object.hashCode 所做的)。嗯……更深入的思考……在处理哈希数据结构(例如 HashMap)时,它成为了一项技术要求,因为它们需要以这种方式实现的 hashCode 方法,Javadoc 解释说。所以,你是完全正确的。
-
始终返回 0 的 hashCode() 根据定义是正确的实现,如果另一个实现依赖于“更正确”的 hashCode() 来提供正确的结果,那么这个另一个实现就会被破坏。
-
我要补充一点,使用盒装
Boolean是非常浪费。但是由于只有两个值,而且布尔值是不可变的,如果需要对象,可以使用预定义的Boolean.TRUE和Boolean.FALSE而不是创建新对象。