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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 简★零度 中级黑马   /  2013-11-19 20:04  /  1585 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两个对象相同(x.equals(y)==true).他们的hashCode是否相同?为什么?
求详解!
求案例!

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
FFF + 1 + 3 不懂就要多问,不然怎么能“天天向上”?哈.

查看全部评分

5 个回复

倒序浏览
本帖最后由 Angel♥儱唲 于 2013-11-19 20:56 编辑

1、如果两个对象相同,那么它们的hashCode值一定相同;
2、如果两个对象的hashCode相同,它们并不一定是相同对象 。

前者是因为根据api中object的hashcode方法的描述中写道:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

后者举例说明String类String s1="abc"   String  s2=new String("abc")   我们知道s1和s2不是同一个对象,但是他们的hashcode值是相同的。





楼下俩位说的是对的,这里还要看equals的方法定义了,自己重写的话结果真的是变化的
public class Test5 {
        public static void main(String[] args) {
              Person p1=new Person("zhang",23);
              Person p2=new Person("lisi",24);
             System.out.println( p1.equals(p2));
              System.out.println(p1.hashCode() == p2.hashCode());
        }
}
class Person{
        String name;
        int age;
         Person(String name,int age)
        {
                this.name=name;
                this.age=age;
        }
        public boolean equals(Object obj){
              return true;
        }
        public int hashCode(){
             return name.hashCode() + age*31;
        }
}

这里任意new出来的对象equals比较都是相等的,但是hashcode是不等的

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
FFF + 1 + 3 赞一个!正确的!感谢同学帮我们解惑!!!.

查看全部评分

回复 使用道具 举报
这个不能确定吧,看你怎么复写hashCode方法了 。
比如
class Person{
String name;
int age;

public boolean equals(Object obj){
      return true;
}
public int hashCode(){
     return name.hashCode() + age*31;
}
}

看这段代码中的我为了省事就equals直接返回true了 ,假如用我这个类创建对象,则每个对象都是相等的。但是hashCode貌似是不同的哦

建议你把代码贴出来,好针对你的问题来说

点评

FFF
我想,她问的,应该是正常情况下的。未从新定义Equals与HashCode方法的情况下的。感觉同学你的精彩回答,让我们看到了这个问题没有想到的一面!  发表于 2013-11-20 00:04
回复 使用道具 举报
你要是调用自带的或者是IDE自动生成的hashcode方法,那就应该是相等的
因为它们是遵守hashcode的常规协定的,
你要是自己写的hashcode方法,那结果完全可以随你喜欢
详解,木有,
案例,懒得打

点评

FFF
技术分?木有。金币?懒得给。哼哼~~  发表于 2013-11-20 00:05
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马