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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 祁焱 黑马帝   /  2011-10-31 22:48  /  2295 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?  为什么?

评分

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

查看全部评分

9 个回复

倒序浏览
对象相等则hashCode一定相等; hashCode相等对象未必相等。
回复 使用道具 举报
当往哈希集合中放入元素时,首先检查哈希值,两个对象的哈希值一样,还不能确定两个对象就是一样的,还要用equals判定
回复 使用道具 举报
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
上面一句话来自API     java中Object类的hashcode方法;
回复 使用道具 举报
本帖最后由 李建雄 于 2011-11-1 00:27 编辑

两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?  为什么?

我来做一下分析:
这句话是对的, 当new两个对象时给他们的值可以相同:这时hashcode值会相同
如:Integer x=new Integer(300);Integer y=new Integer(300);
但是我们可以重写hashcode()方法,让他们产生不同的hashcode值
回复 使用道具 举报
LS+1   {:soso_e104:}{:soso_e176:}{:soso_e192:}
回复 使用道具 举报
白倩 黑马帝 2011-11-1 06:21:23
7#
往集合中存放元素时首先比较的是两个对象的hashcode值如果相等还要判断它们的equals是否相等,总的来说两个对象相等它们的hashcode值一定相等,但如果两个对象的hashcode相等则对象不一定就相等因为我们可以重写它们的hashcode方法使哈希值不同。
回复 使用道具 举报
吉许 黑马帝 2011-11-1 09:13:40
8#
这句话是对的,在两个对象的hashcode值相同的情况下才会equals比较他们
值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象
所以hashcode不同是很正常的
就好比我定义个类,有名字和编号
我重写equals方法,让名字相同就返回相等
那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样)
但他们的hashcode当然不同
因为根本就不是一个对象嘛
回复 使用道具 举报
fso918 黑马帝 2011-11-1 10:36:54
9#
本帖最后由 fso918 于 2011-11-1 10:37 编辑

class Student{
   private id ;
   private age;
   public Student(int id,int age){
       this.id = id;
       this.age = age;
   }
   @Override
   public int hashCode(){
       return id + age;
    }
    @Override
    public boolean equals(Object obj){
        if(obj instanceof Student)
              return obj.id == this.id;
        return false;
     }
}
class Test{
      public void main(String[] args){
          Student s1 = new Student(10,11);
          Student s2 = new Student(10,12);
          System.out.println(s1.hashCode() == s2.hashCode());
          System.out.println(s1.equals(s2);
      }
}
回复 使用道具 举报
黄健 黑马帝 2011-11-1 11:16:20
10#
对:java是灵活的,对象是自己设计的,你想让它相同它就相同,你不想让它相同它就不同。
不对:jdk中hashCode 的常规协定是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

最好还是按照java协定的来,不然你用到它的其他类时会郁闷(如set集合)。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马