rt

解决方案 »

  1.   

    我认为对.equals  和 hascode 是两个不同的方法,可以自己重载
      

  2.   

    可以不同不过api上是这么写的
    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
      

  3.   

    一般的类都把equals方法重写了,重写以后是用来比较两个对象的内容是否相同,而不是用来比较是否同一个对象!
      

  4.   

    http://community.csdn.net/Expert/topic/4417/4417687.xml?temp=.3007166
    看这个帖子,把我快搞晕了
      

  5.   

    同意永不褪色的话,我们是把equals重写比较内容是否相同。如果你(x.equals(y) == true)中的equals已经被重写了那么可以返回相同的hashcode,要是没有的话返回的是不同的hashcode。
      

  6.   

    在JDK的规范中,A.equals(B) 一定可以推出 A.hashCode() == B.hashCode(); 反之则不一定成立
    当然,你在自己的类中可以不符合上述规范,但是这样做的后果就是无法放入HashMap这些类中
    因为 map.put(A, value)  之后,应该来说是可以通过 map.get(B) 返回 value的但是由于hashCode不相同,那么map也就找不到value的位置了
      

  7.   

    :)这句话在java语法上对,在java规范上错
      

  8.   

    ChDw(米)说得对,一般推荐对象扩展equals时都要扩展hashCode
      

  9.   

    两个对象值相同(x.equals(y) == true),但却可有不同的hash code
    =========================
    楼主的问题答案应该是不对的;
    这要求我们覆写equals同时必须overridden hashCode方法;hashCode的默认约定中有一条:
    如果两个对象根据equals(o)是相等的,则调用这个两个对象中人一个对象的hashCode方法必产生同样的整数结果同时建议看看EFFECTIVE JAVA上面说的很清楚
      

  10.   

    1. equals() 和 hashCode() 是2个不同的方法,要实现 "(x.equals(y) == true),但却可有不同的hash code" 是能做到的。2. 但这样做非常不好。在 Hashtable 中是这样使用 equals() 和 hashCode() 的:get 和 put 时,首先使用 hashCode() 进行在 keys 中定位和查找,这样会提高查找效率。如果现有多个 key 的 hashCode 相同,再用 equals 在具有相同 hashCode 的这几个 key 中进行依次查找。也就是说,java 中的设计思想是:允许不同对象有相同的 hashCode(),但是 equal 的对象的 hashCode 肯定是相同的。equals() 在 java 中被认为:对象之间 "一模一样"。
      

  11.   

    违背这个原则,写出来的对象,在作为 Hashtable 的 key 时,或者说类似使用情况时,将会使现有的一些非常有用工具类(java.util)变得混乱。
      

  12.   

    equals()方法比较的是两个对象的内容,相等返回true.
    object.hashcode()方法返回的值叫做散列码,是根据对象在堆内存中的首地址转换过来的.
    既然是对象,在堆内存中的首地址必然不同,所以返回的散列码也必然不同.
    所以这句话可以说是对的.
      

  13.   

    equals()方法比较的是两个对象的内容,相等返回true.
    object.hashcode()方法返回的值叫做散列码,是根据对象在堆内存中的首地址转换过来的.
    既然是对象,在堆内存中的首地址必然不同,所以返回的散列码也必然不同.
    所以这句话可以说是对的.
    ---------------------
    这位老兄讲得很有问题吧
    hashcode并非一定是首地址,每个类都可以定义自己的hashcode,
    public int hashCode(){return 17;}
    z这样该类的所有对象都返回相同的hashcode,但他们不可能都是对同一个地址的引用,只不过hashcode要尽量的避免重复,所以这样的写法显然是不可接受的,但逻辑上没错从语法角度来讲,equals跟hashcode没有必然的关系,但是override的时候建议也override hashcode,使得equqls返回true的时候,hashcode也相等
      

  14.   

    TO; shine333(enihs) 
    其实我一直想告诉你一件事,我是复写过TOSTRING()函数的,不过我复写它的时候都要调用HASHCDE()函数,就想我复写“一阔”函数一样!!喜喜;-)
      

  15.   

    不对的
    hashCode肯定也一样,不信可以验证
      

  16.   

    一靠再靠!equals(), hashCode(), toString() 这些都是相互独立的方法而已,要怎么实现随你便。
    只是说怎么样好怎么样不好而已,不知道搂主有没有听懂。实在不想在此过多讨论这个无聊的问题。
      

  17.   

    不对的
    hashCode肯定也一样,不信可以验证
    -------------------
    class A{
     int a;
     public A(int a){this.a = a;}
     public boolean equals(Object o){return true;}
     public int hashCode(){return a;}
    }老兄,这个类有问题吗,equals返回true,hashCode也肯定一样?
      

  18.   

    to; sswater(光杆兵)既然是相互独立的方法而已,要怎么实现随你便。那么请解释下面的结果吧
    class A{ public int hashCode(){this.toString();return 55;}
     public static void main(String[] args)
     {
      A ss=new A();
      ss.hashCode();
            
     }
    }
      

  19.   

    to; sswater(光杆兵)既然是相互独立的方法而已,要怎么实现随你便。那么请解释下面的结果吧
    class A{ public int hashCode(){this.toString();return 55;}
     public static void main(String[] args)
     {
      A ss=new A();
      ss.hashCode();
            
     }
    }
    ---------------------------------
    老兄,这个要解释什么?你的代码想说明什么
    我认为sswater(光杆兵)讲的并没错,这些方法之间的并不存在强制的约束关系,只不过按照jdk规范,或者出于散列等方面的因素,通常在改写equals方法同时也需要改写hashCode,也就是sswater(光杆兵)说的“只是说怎么样好怎么样不好而已”
      

  20.   

    TO:believefym(暮色,miss,迷失,miss) 
    老大姐我要他解释运行结果啊
      

  21.   

    TO:believefym(暮色,miss,迷失,miss) 我想说的是没复写过的TOSTRING()会调用HASHCODE();没复写TOSTRING(),就不能随意复写HASHCODE(),他们还是有一定关系的!!不跟你们这些大人物说了,你的分那么多奖赏小弟几分吧。
      

  22.   

    TO:believefym(暮色,miss,迷失,miss) 
    给我点分吧!嘻嘻,你是一个帅哥!!
      

  23.   

    toString当然和hashCode没有什么直接关系,你说它会调用hashCode倒是正确的。但是绝对不是没有复写toString就不能复写hashCode
    一般在自己写的类中,我如果需要复写就hashCode, toString equals都一起复写的
      

  24.   

    TO :ChDw(米) ( )
    刚上完课回来,唉,美女总是配丑男!都会调用它了,你还说没有直接关系!如果它们都已经独立了,那还存在什么调用关系!你们几个人认识的吧!还有啊,我是针对上面说不可以随意写,而不是说不能复写hashCode!你们几个人认识的吧!当然我没说他们有直接关系,因为你所说的直接关系指的是什么,你举个例子吧!最后,我还是觉得,你们是认识的吧!
      

  25.   

    我记得不久前也是跟2个星的辩论!我说“可以这么说吧equals是为hashCode相同而定的”,结果什么谬论之类,还有一大堆令人生畏的解释!其实你们今天讨论的还是那个话题“可以这么说吧equals是为hashCode相同而定的”,我挺荣幸的!反对这句话的都是书呆子!
      

  26.   

    该怎么说楼上这位老兄呢,首先不讨论这个帖子的内容,光看你一连发三个帖子,个个都是n多的!,有必要这么激动吗,似乎你很难接受别人不同意你的观点
    “我挺荣幸的!反对这句话的都是书呆子!”
    --------
    似乎你好像觉得自己就是对的似的,似乎说别人书呆子是你的特权,别人说一点过火的话似乎就违背你说的“1,反对粗俗语言”,
    我怎么觉得似乎是你在说“粗俗语言”,是你在用“你行别人不行的态度去看别人”
    还有什么认识不认识的,别瞎猜了,认识又怎么样,不认识又怎么样,到这里讨论问题的人不会因为认识而说一些违心的话,至少我这里的人一个都不认识,至多他们的ID很熟悉而已
      

  27.   

    对的,但是不建议这么做的。public class Test
    {
        int value;
        public Test(int value)
        {
            this.value = value;
        }    /**
         * 覆写equals 根据value判断
         * @param o
         * @return
         */
        public boolean equals(Object o)
        {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }        final Test test = (Test) o;        if (value != test.value) {
                return false;
            }        return true;
        }    public static void main(String[] args)
        {
            Test test1 = new Test(1);
            Test test2 = new Test(1);        System.out.println("test1 hashcode is:" + test1.hashCode());
            System.out.println("test2 hashcode is:" +test2.hashCode());        System.out.println("test1 equals test2 is:" + test1.equals(test2));
        }
    }此代码在我机器上执行的结果为:
    test1 hashcode is:24287316
    test2 hashcode is:7254922
    test1 equals test2 is:true请说不对的同志执行以下,hashcode的值可不同。
      

  28.   

    没有说这句话不对,只是这样会造成问题而已Test test1 = new Test(1);
    Test test2 = new Test(1);HashMap map = new HashMap();
    map.put(test1, "Value");
    System.out.println(map.get(test2)); 这样是会非常可能返回null的,除非运气很好。
      

  29.   

    我是用.net的  前些天也碰到过这个问题  这种问题估计星星多的也不会来了  我查了一些资料  稍微有点明白(我是说.net中  估计java和.net应该是一样的)首先应该说  equal 和 gethashcode 都可以重写  就是说你怎么写都可以其次 需要弄明白 gethashcode 这个函数的作用是什么  equal 和 gethashcode 这两个函数到底是什么作用  弄清楚这个  应该好理解一些
    ******************************************************************
    回复人: ChDw(米) ( ) 信誉:155  2005-12-21 09:43:00  得分: 0  
     
     
       没有说这句话不对,只是这样会造成问题而已Test test1 = new Test(1);
    Test test2 = new Test(1);HashMap map = new HashMap();
    map.put(test1, "Value");
    System.out.println(map.get(test2)); 这样是会非常可能返回null的,除非运气很好。 *************************************************************************
    说得很对  gethashcode是用来做hash的key   而不是用来判断是否相等的 在这里看到了这片帖子  有学到了很多东西  感谢  ChDw(米)
     
      

  30.   

    equals和hashcode是两个独立的方法,但是JDK底层实现中又有关联
    而在Effective Java里是推荐尽量保持一致的其中一个主要原因:
    如果该对象作为哈希表中的key存在,那么如果equals和hashcode不相等,则容易导致冲突(哈希表内查找),散列表冲突虽然有很多种数学解决办法,但必然会影响哈希表查找的速度
      

  31.   

    不对,因为两个对象相等,首先类型要匹配,类型匹配的对象一定有相同的hashcode。还记得instanceof运算符吗,它就是依据hashcode进行判别的。
      

  32.   

    我的理解是:
    除非你重载equals方法.否则判断对象相等的条件是,首先类型匹配,还有就是hashcode相等.
      

  33.   

    to  Mailbomb
    错误,类型相同根本不代表hashCode相同,请你实验后再说,不要误导别人。
    instanceof 更不是依据hashCode判断
    System.out.println(new Integer(1).hashCode());//打印1
    System.out.println(new Integer(2).hashCode());//打印2判断两个对象是否相等的条件就是equals返回true,hashCode主要是使用在HashMap这些地方
    可以提高比较速度