黑马程序员技术交流社区

标题: hashcode 和equals问题 [打印本页]

作者: 晓风妮子    时间: 2013-4-20 15:51
标题: hashcode 和equals问题
如果两个对象通过equals方法比较是true,这两个对象的hashcode值可以不相等吗?
作者: zn123_4    时间: 2013-4-20 15:57
不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。
下面的话来自JDK:
hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?必须重写hashcode方法维护常规协定!如果你不重写,那么就不能保证hashcode返回相同结果。
作者: 先小涛    时间: 2013-4-20 16:45
首先比较两个对象是否相同,是看需求而定的,一般在以哈希表为数据结构的集合中判断对象是否相同的机制是首先通过hashCode方法,若返回值不同,则认为是不同对象。否则,还要调用equals方法来判断是否相同。这里是通过这两个方法共同决定的,但首先判断的是hashCode方法。
所以如果两个对象通过equals方法比较是true,这两个对象的hashcode值可以不相等。
还有一种比较方法是在以二叉树为数据结构的集合中判断对象是否相同,则要实现comparaTo方法。
作者: zZZ~~    时间: 2013-4-20 18:00
可以实现hashCode 的值不相等
但是,这样没有意义
equals(), hashCode(), toString() 这些都是相互独立的方法而已,这些方法之间的并不存在强制的约束关系,要怎么实现就随便自己怎么做了
public class Test
{
    int value;
    public Test(int value)
    {
        this.value = value;
    }

    /**
     * 覆写equals 根据value判断
     * @param o
     * @return
     */
    public boolean equals(Object o)
    {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final Test test = (Test) o;

        if (value != test.value) {
            return false;
        }

        return true;
    }

    public static void main(String[] args)
    {
        Test test1 = new Test(1);
        Test test2 = new Test(1);

        System.out.println("test1 hashcode is:" + test1.hashCode());
        System.out.println("test2 hashcode is:" +test2.hashCode());

        System.out.println("test1 equals test2 is:" + test1.equals(test2));
    }
}

此代码在我机器上执行的结果为:
test1 hashcode is:24287316
test2 hashcode is:7254922
test1 equals test2 is:true


作者: JavaUtil    时间: 2013-4-20 18:29
上面几楼都说的很多了,我就简单点说吧。
两个对象通过equals方法比较是true,这两个对象的hashcode值相不相等是看你自己怎么实现的。
如果类是你自己编的,你想怎么处理都可以。
如果类是被人实现的,看他的equals方法的实现。
作者: 黄玉昆    时间: 2013-4-22 08:11

如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2