黑马程序员技术交流社区

标题: 两对象值相同 判断hash code [打印本页]

作者: 谢明    时间: 2012-3-9 17:08
标题: 两对象值相同 判断hash code
x.equals(y) == true   两对象值相同   能否判断  hash code  相同
作者: 马胜平    时间: 2012-3-9 17:26
本帖最后由 马胜平 于 2012-3-9 17:32 编辑

这要看你比较的对象所对应的类是否重写hashCode以及是如何重写hashCode方法的,至于为啥要重写以及如何重写以及hashCode的作用,说来话长啊....论坛搜搜有。
作者: 杨毅    时间: 2012-3-9 17:38
不可以,举个最简单的例子
public static void main(String[] args) {
                // TODO Auto-generated method stub
                Person p1 = new Person("abc");
                Person p2 = new Person("abc");
                System.out.println(p1.equals(p2));
                System.out.println((p1.hashCode())== (p2.hashCode()));
        }
}
class Person{
        private String name;
        Person(String name ){
                this.name = name;
        }

        public boolean equals(Person p){
                return name == p.name;
        }
}
这个equals为true , hashCode 为false
作者: 刘蕴学    时间: 2012-3-9 18:18
本帖最后由 了无尘 于 2012-3-9 18:24 编辑
杨毅 发表于 2012-3-9 17:38
不可以,举个最简单的例子
public static void main(String[] args) {
                // TODO Auto-generated method st ...


equals的含义是,两个对象的值相等(即参数相等),但对象可以不相等
x == y 为false
x.equals(y) 为true

==是指完全相等,换句话来说
x == y 为true
那么 x.equals(y) 必定为true

hashcode有点特殊
如果x.equals(y) 为true 那么x.Hashcoe() == y.Hashcode() 必定返回true
反之却不一定,这种情况我们叫哈希冲突,比较常见的是2个不同的对象返回一样的结果,还有一种比较特殊,即一组对象的个数超过int范围,而hashcode是的长度也是int范围,那么肯定会有一组元素有一样的哈希值


这些在api上都有说明,详见Object类,以及该类的源代码

但是如果以上2个函数被重写,那么就得看具体的实现方式了

楼上的结果不一致的原因是他把equals方法重写了,所以不一样,但是如果把这个方法删除了,那么结果都为false
作者: 许圣建    时间: 2012-3-9 18:38
equals()方法只是个名字,他在不同的类中不进行了不同的覆写,楼主在这里随便来一个equals(),
你说比较的是两“对象”的值,意思就是比较的是对象的内容,一个对象的内容是否是和哈希值一一对应的呢?
这又要看你的hashCode()方法,楼主也是随便一个hashCode(),也就是未覆写的默认函数,我们再看默认hashCode()是怎样计算的,
根据常规协定:相等的对象必须有相同的hashCode哈希值。这也是通常覆写了equals()之后,通常也要覆写hashCode()的原因,因为要保证常规协定。
所以楼主这句话,在一定情况下是正确的





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