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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢明 中级黑马   /  2012-3-9 17:08  /  2343 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

x.equals(y) == true   两对象值相同   能否判断  hash code  相同

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 马胜平 于 2012-3-9 17:32 编辑

这要看你比较的对象所对应的类是否重写hashCode以及是如何重写hashCode方法的,至于为啥要重写以及如何重写以及hashCode的作用,说来话长啊....论坛搜搜有。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
不可以,举个最简单的例子
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

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
本帖最后由 了无尘 于 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

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
equals()方法只是个名字,他在不同的类中不进行了不同的覆写,楼主在这里随便来一个equals(),
你说比较的是两“对象”的值,意思就是比较的是对象的内容,一个对象的内容是否是和哈希值一一对应的呢?
这又要看你的hashCode()方法,楼主也是随便一个hashCode(),也就是未覆写的默认函数,我们再看默认hashCode()是怎样计算的,
根据常规协定:相等的对象必须有相同的hashCode哈希值。这也是通常覆写了equals()之后,通常也要覆写hashCode()的原因,因为要保证常规协定。
所以楼主这句话,在一定情况下是正确的

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马