`

两个对象用equals方法比较为true,它们的Hashcode值相同吗?

 
阅读更多

两个对象用equals方法比较为true,它们的Hashcode值相同吗?

       答:不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。

下面的话来自JDK:

hashCode 
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是: 

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

equals 
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 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 

 

看看红色的部分,说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?下面这段红色字体说了,必须重写hashcode方法维护...协定!如果你不重写,那么就不能保证hashcode返回相同结果。

换句话说:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。

分享到:
评论
3 楼 chwshuang 2012-07-30  
不过要谢谢你的提问~!!
2 楼 chwshuang 2012-07-30  
看看红色的部分,说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?下面这段红色字体说了,必须重写hashcode方法维护...协定!如果你不重写,那么就不能保证hashcode返回相同结果。
换句话说:重写equals方法时请必须重写hashcode,以保证equals方法相等时两个对象hashcode返回相同的值。
1 楼 yangqihong 2011-08-18  
public class TestMain {

class A1{

private int i;

public A1(int i){
this.i = i;
}

public int getI(){
return i;
}

public boolean equals(Object o){
A2 obj = (A2)o;
return i==obj.getI();
}
}

class A2{

private int i;

public A2(int i){
this.i = i;
}

public int getI(){
return i;
}

public boolean equals(Object o){
A1 obj = (A1)o;
return i==obj.getI();
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestMain t = new TestMain();
A1 a1 = t.new A1(3);
A2 a2 = t.new A2(3);
System.out.println(a1.equals(a2));
System.out.println(a1.hashCode()==a2.hashCode());
}

}

运行结果,true,false,能给出解释么?

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...

    HashCode相同equals不同的2位字符集合算法

    在Java编程语言中,`hashCode()` 和 `equals()` 是两个非常重要的方法,它们主要用于对象的比较和哈希表(如HashMap)的操作。标题提到的"HashCode相同equals不同的2位字符集合算法"涉及到的是一个特定场景:两个...

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法都是用于比较两个对象是否相等的,但它们的实现方式不同。equals 方法是比较两个对象的内容是否相等,而 hashCode 方法是根据对象的内容来计算哈希码。在实际开发中,我们需要根据具体...

    java中hashcode()和equals()方法详解

    - 相反,如果两个对象的`hashCode()`值相同,并不能保证这两个对象通过`equals()`方法比较也是相等的。这是因为可能存在不同的对象具有相同的哈希值,这种情况称为哈希冲突。 - 为了避免哈希冲突带来的性能问题,在...

    Java中equals,hashcode和==的区别

    如果我们定义两个字符串 s1 和 s2,並将它们赋值为 "abc",然后使用 equals 方法比较它们,结果当然是 true。 最后,hashcode 方法是一个对象的散列码,它是用来唯一标识一个对象的。hashcode 方法可以将一个对象...

    关于Object中equals方法和hashCode方法判断的分析

    Java 在判断两个对象是否相同时,首先会比较它们的 hashCode 值,如果相同,那么就会比较它们的 equals 方法,如果 equals 方法也返回 true,那么这两个对象就被认为是相同的。 下面是一个简单的示例代码,演示了...

    java中Hashcode的作用.docx

    只有当两个对象的Hashcode相同,并且equals方法返回true时,这两个对象才能被认为是相等的。 Hashcode的作用 Hashcode的主要作用是用来标识对象的身份。在Java中的散列表(如HashMap、HashSet等)中,Hashcode扮演...

    解析Java对象的equals()和hashCode()的使用

    equals()函数是用于进行两个对象的比较的,是对象内容的比较,当然也能用于进行对象参照值的比较。什么是对象参照值的比较?就是两个参照变量的值的比较,我们都知道参照变量的值其实就是一个数字,这个数字可以看成...

    Java_重写equals()和hashCode()

    当两个对象根据 `equals()` 方法判断相等时,它们的 `hashCode()` 方法必须返回相同的值。这是为了确保哈希表能够正确地将相等的对象映射到相同的槽位上。如果两个对象不相等,那么它们的哈希码不一定不同,但不同的...

    Java中的equals和hashCode方法详解1

    如果两个对象通过`equals()`方法比较后相等,那么它们的`hashCode()`方法必须返回相同的值。这是因为哈希表(如`HashSet`)依赖于`equals()`和`hashCode()`的一致性来正确地存储和查找对象。如果两个对象相等但它们...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    set接口经常用的hashCode和equals方法详解

    在这个例子中,`equals`方法根据`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode`方法也综合考虑了这两个属性,以确保`equals`方法返回`true`的对象具有相同的哈希码。 #### 七、总结 在Java中,...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    hashcode()和equals()

    如果两个对象的 `equals()` 返回 `true`,那么它们调用 `hashCode()` 必须返回相同的值,否则可能会导致哈希表冲突,影响效率。 `equals()` 方法用于比较两个对象是否相等。在 `Object` 类中,它的默认实现是基于...

    重写equals方法

    2. 判断两个对象的类类型是否相同,可以使用 getClass() 方法来比较类字节码,或者使用 instanceof 关键字来判断左边的对象是否为右边类的实例对象。 3. 根据自己的需求决定哪个属性相同。例如,在 User 类中,可以...

    面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

    按照 Java 的约定,如果两个对象通过 `equals()` 方法判断为相等,那么它们的 `hashCode()` 值也应该相等。这就是为什么在重写 `equals()` 时,通常也需要重写 `hashCode()`。 来看看 `String` 的 `hashCode()` ...

    java 基础之(equals hashcode)

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 和 `HashSet`)时。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于...

    为什么在重写 equals方法的同时必须重写 hashcode方法

    默认情况下,`equals` 方法比较的是两个对象的引用,即是否指向内存中的同一个位置,而 `hashCode` 方法则返回对象的内存地址的一个哈希值。在某些情况下,尤其是当我们自定义类并希望基于特定属性(如学号)判断...

    hashcode和equals的分析

    1. **一致性**:如果两个对象相等(通过`equals`方法判断),则它们的`hashCode`值必须相同。 2. **可变性**:如果两个对象的`hashCode`值相同,并不一定意味着这两个对象相等。 ### 3. 实例分析 假设我们有一个名...

Global site tag (gtag.js) - Google Analytics