站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题为什么说:“如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结

为什么说:“如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结

摘要: 为什么说:“如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结


为什么说:“如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 ”?


请注意,他说的是“必须”,而不是“必定”也就是说,你在写自己的class的时候“应该”遵守"a.equals(b)" <=> "a.hashCode() == b.hashCode()"


为什么equals与hasecode存在这样的关系呢?


Hashtable和HashMap等使用hashCode作为key值参考,所以相等的对象(equals(Object))须有相同hashCode


这是一个规范,因为在HashMap等常用数据结构,算法中hashCode会被用于寻找存放位置,而equals用于判断两者是否相同。

显然你不能造成放在同一位置的Key不相同,或者不相同的两个Key放在一个位置,或者不同位置的Key相同,或者相同的Key位置不相同。


上面
"a.equals(b)" <=> "a.hashCode() == b.hashCode()"
说错了,

应该是
"a.equals(b)" => "a.hashCode() == b.hashCode()"单向的,hashCode相同不能保证equals


对,API经常出现
at the option of the implementation
就是说sun/jcp只给出了框架,并给出实现的建议以及最好的(也就是SUN的JDK实现的形式),但是,究竟实现成什么样就是由实现者决定了,只要逻辑正确就OK,使用的时候需要参照API


楼上的正确啊,


↑返回目录
前一篇: 有段c的程序,需要用java写,请熟悉c和java的高手帮忙,谢谢!
后一篇: 关于NumberFormat的使用