当前位置: 代码迷 >> J2SE >> 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?解决方案
  详细解决方案

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?解决方案

热度:537   发布时间:2016-04-23 20:55:56.0
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
求解释
------解决方案--------------------
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。 
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。 
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数
------解决方案--------------------
这句话是错误的。

两个对象实例不同,hash code可以相等,因为没有完美的hash函数。
反过来说的话,就是错误,因为你不能保证类的使用者不使用HashSet/HashMap
------解决方案--------------------
引用:
这句话是对的

equal的对象未必hashcode相同
反过来,hashcode相同也未必equal

最后一句话错了 hashCode是对象的唯一标记 如果说两个对象的唯一标记相等 其equals的结果必须相等

http://blog.csdn.net/KindAzrael/article/details/4633615
------解决方案--------------------
直接上API




public boolean equals(Object obj)指示某个其他对象是否与此对象“相等”。 
equals 方法在非空对象引用上实现相等关系: 

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。 
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。 
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。 
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。 
对于任何非空引用值 x,x.equals(null) 都应返回 false。 
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 


参数:
obj - 要与之比较的引用对象。 
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。


-----------------

public int hashCode()返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。 
hashCode 的常规协定是: 

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。 
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。 
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 


返回:
此对象的一个哈希码值。
  相关解决方案