A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 晓风妮子 中级黑马   /  2013-4-20 15:51  /  1577 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果两个对象通过equals方法比较是true,这两个对象的hashcode值可以不相等吗?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
不一定相同。正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同。但是如果不重写hashcode方法,就会出现不相等的情况。
下面的话来自JDK:
hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

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

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
说明的是JDK规定当你调用equals方法比较两个对象相等时,他们调用hashcode方法时,都应该返回相同的整数值,也就是hashcode相等。记住,是应该相同。为什么应该?必须重写hashcode方法维护常规协定!如果你不重写,那么就不能保证hashcode返回相同结果。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
首先比较两个对象是否相同,是看需求而定的,一般在以哈希表为数据结构的集合中判断对象是否相同的机制是首先通过hashCode方法,若返回值不同,则认为是不同对象。否则,还要调用equals方法来判断是否相同。这里是通过这两个方法共同决定的,但首先判断的是hashCode方法。
所以如果两个对象通过equals方法比较是true,这两个对象的hashcode值可以不相等。
还有一种比较方法是在以二叉树为数据结构的集合中判断对象是否相同,则要实现comparaTo方法。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
可以实现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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
上面几楼都说的很多了,我就简单点说吧。
两个对象通过equals方法比较是true,这两个对象的hashcode值相不相等是看你自己怎么实现的。
如果类是你自己编的,你想怎么处理都可以。
如果类是被人实现的,看他的equals方法的实现。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报

如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马