黑马程序员技术交流社区

标题: 关于哈希值的一个问题 [打印本页]

作者: 祁焱    时间: 2011-10-31 22:48
标题: 关于哈希值的一个问题
两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?  为什么?

作者: 肖居上    时间: 2011-10-31 22:57
对象相等则hashCode一定相等; hashCode相等对象未必相等。

作者: 张邦庆    时间: 2011-10-31 23:02
当往哈希集合中放入元素时,首先检查哈希值,两个对象的哈希值一样,还不能确定两个对象就是一样的,还要用equals判定
作者: 孙运强    时间: 2011-10-31 23:28
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
上面一句话来自API     java中Object类的hashcode方法;

作者: 李建雄    时间: 2011-11-1 00:25
本帖最后由 李建雄 于 2011-11-1 00:27 编辑

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

我来做一下分析:
这句话是对的, 当new两个对象时给他们的值可以相同:这时hashcode值会相同
如:Integer x=new Integer(300);Integer y=new Integer(300);
但是我们可以重写hashcode()方法,让他们产生不同的hashcode值

作者: 骚灵小情歌    时间: 2011-11-1 00:28
LS+1   {:soso_e104:}{:soso_e176:}{:soso_e192:}
作者: 白倩    时间: 2011-11-1 06:21
往集合中存放元素时首先比较的是两个对象的hashcode值如果相等还要判断它们的equals是否相等,总的来说两个对象相等它们的hashcode值一定相等,但如果两个对象的hashcode相等则对象不一定就相等因为我们可以重写它们的hashcode方法使哈希值不同。
作者: 吉许    时间: 2011-11-1 09:13
这句话是对的,在两个对象的hashcode值相同的情况下才会equals比较他们
值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象
所以hashcode不同是很正常的
就好比我定义个类,有名字和编号
我重写equals方法,让名字相同就返回相等
那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样)
但他们的hashcode当然不同
因为根本就不是一个对象嘛
作者: fso918    时间: 2011-11-1 10:36
本帖最后由 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
对:java是灵活的,对象是自己设计的,你想让它相同它就相同,你不想让它相同它就不同。
不对:jdk中hashCode 的常规协定是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

最好还是按照java协定的来,不然你用到它的其他类时会郁闷(如set集合)。




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