当overwrite了一个Object的equals方法,一般还要overwrite什么方法,为什么?

解决方案 »

  1.   

    hashCode()一般equals()是调用hashCode()来进行比较的
      

  2.   

    hashcode()
    只知道要重写的话
    这两个都要重写
      

  3.   

    hashcode() 
    是建议要重写....
      

  4.   

    还要重写hashCode()方法,在没有重写equals()方法之前,x.equals(y)返回true当x与y都指向同一个对象,至于为什么要重写hashCode()方法,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.
      

  5.   

    重写就不会用hashCode比较了吧
      

  6.   

    equals是比较,hashcode是确定对象存储的内存位置吧
      

  7.   

    这段话是这个意思:如果你重写了equals方法,一般来说也应该重写hashCode方法,这是为了维持一个惯例,即equal的对象应该有相同的hash codes。
    但是这一点不是必须的,你可以认为是“强烈建议”吧,毕竟,在实际使用当中,如果你的类被其他人使用,而你只改写了两个方法中的一个,打破了“equal的对象有相同的hash codes”这个惯例,别人使用的时候可能会因为调用了这两个方法而导致同样的逻辑产生不同的结果。
      

  8.   

    汗....hashcode()没那么肤浅吧?
    重写equals要遵循几大原则,我记得不太清楚了.如a==a永远是true,就是自己和自己比相等,叫自反性吧;a==b那么b==a,对称性原则;a==b,b==c,那么a==c,传递性.好像还有,我不记得了.
    hashcode()要求两个相等的对象,返回的hashcode()值是一致的.
    hashcode()主要是放在容器里用的,hashcode()算法设计得越好,查找时越容易找到,速度越快.Set类容器就是根据这个equals来比较,实现数学上的集合的功能,而查找是通过hashcode()来查找,Set是无序的,其实是靠hashcode()来排成一特定序列,方便查找的.
    hashcode()算法怎么算是好呢?就是每个对象返回的hashcode()都不一样,除非这些对象是相等的,当然这种理想状态是不现实的,据说数学上证明用素数来设计hashcode()会理想些,素数越大越理想.
    欢迎拍砖.
      

  9.   

        equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 
    hashCode():返回该对象的哈希码值
        hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
      

  10.   

    equals对比object的同值性,
    hashCode对比object的同一性。equals和hashCode结果很像,但是,严格上讲,根本就是两种东西。
    overwrite equals方法,并没有overwrite hashCode的义务,就算overwrite hashCode,JVM中间已经定义了严格的对比方法,你要复写什么?
    相比equals的overwrite,特别是对于bean的值对比往往需要自己overwrite
      

  11.   

    他只是问为什么要重写,没问怎么重写,另外自反性传递性那几条规则在API文档里面有,查一下就行了
      

  12.   

    答案是hashCode()方法没错,原因上面基本也讲出来了。我这里给你说通俗一点,而不是枯燥地抄袭和翻译javadoc。
    你如果自己比较对象,通常一定是会使用equals()方法的。所以很难想像hashCode()方法是干吗的。但是有一些地方是不看equals()方法的。
    哪里呢?就是HashMap, HashSet....的Hash一族。
    你可以看一下HashMap的源代码(HashSet就不要看了,因为是用HashMap实现的),当通过一个key来取得对应的value时,它首先就是调用key的hashCode()方法来取得一个int的值,然后经过一系列变换,找到value所在的位置(通常是一个数组中的一个链表中的某个元素,要么就是反过来,记不清了)。如果你不知道HashMap是个什么东西,那么建议你回头详细看看Map相关的知识。说白了就是一个户口登记表。
    你可以通过Map用一堆名字来存储一堆对象,之后再通过某个名字取出某个对象。而当取出对象的时候,就是通过hashCode()方法的返回值相等与否来判断是否同一个名字的。如果hashCode()和equals()没有按照如上各位说的方式来实现,就会出现两个对象用equals()方法判断相等但从HashMap中取出不同内容的现象,或者反之(用equals()判断不相等的两个对象从HashMap中取出了同一个对象)。如果你同时使用ArrayList和HashMap的话,就更有趣了,因为ArrayList中使用equals()判断相等。(这种情况在复杂一点的算法中恰恰经常存在。)
      

  13.   


    17楼的观点错误。overwrite equals()方法,就有义务overwrite hashCode()方法。这是JavaDoc里面明确说明的。
      

  14.   

    呵呵,我们都喜欢啊~
    看了楼下的帖子,知道了equals()和hashCode()的关系
    重写主要是为了维护已有的约定!学习了~
      

  15.   

    equals方法和hashCode方法一般要重载。 
    equals方法主要用于集合类中,用于判断两个对象是否相等。 
    hashCode方法用于HashSet,HashMap的哈希函数。 
    当没重载这两个方法,把对象放到容器中,会出现意想不到的问题。 你还可以重载toString()方法,用于将对象显示出字符串。System.out.println(myclass). 还有clone方法也可以考虑重载,如有必要。 
    以下这段文字摘自Think In Java: 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义: 
    equals() 
    hashCode() 
    toString() 
    clone()(implement Cloneable) 
    implement Serializable 
      

  16.   

    除了hashCode()之外 compareTo()可以么?
      

  17.   

    记得在排序时 同样也覆盖了equals()
      

  18.   

    当然是hashCode()啦,这是一个良好的编程习惯
      

  19.   

    没错 虽然从语法上看hashCode()不写也没什么问题,但是为了保持java协议规范:只要重写了equals()就应该重写hashCode(),hashCode()的是返回一个散列码,并不是非要返回一个有实际意义的值,其具体的算法可以根据自己的需要来写。例如如果你写了一个学生类,可以根据学生号来算散列码。
    只需保证两个equals()为true的对象的hashCode()码相同即可。这就是所谓的一致或联动规范。
      

  20.   

    我们的老师是这样说的,在重写equal方法时建议重写hashcode(),其实不写也是正确的,但是在hashcode()中重写equal就要重写hashcode()是一种规则,就像编码规范一样,不重写就违反了这个规范,所以应该重写hashcode()。
      

  21.   

      是hashcode(),
      其实我觉得hashcode是一种equals用来比较两个对像是否相等的凭据
    object中的hashcode实际上对象在内存中的地址,如果自己的类不重
    写的话,就会按照地址比较,结果2个对象通常不等,除非指向同一
    地址,
       所以实际上hashcode是给你一种自己定义比较方式的权利,他是
    要生成散列码,自己定义的时候,一定要确保散列码尽可能的唯一,
    那样才有意义比如 字符串“abc”和“bac”生成的散列码要不同
      

  22.   

    众说纷纭,今天完成任务,特来拜访,在我的印象中是,overwrite并不是必须重写hashCode()方法,上面说的很对,知识强烈建议,但是我重写的是些,基本上没有重写hashCode()方法,你比较的主要是对象是不是同一个类型的对象或者是不是同一个对象,才会重写,而对象传递的知识内存地址的引用,不回传递里面的值,你拿到的只是一个内存地址罢了.这样你重写equals()方法也是可以的,我只要把里面的一个特定属性拿来比较一下,看看相等不就可以了.
      

  23.   

    JDK API 1.6文档原文:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 
      

  24.   

    学习,从来没去分析过Java中自带的类什么的~
      

  25.   

    呵呵,如果不重写的话,你就会发现可能在HashMap、HashSet等依赖Hash的集合类找不到了
      

  26.   

    好像 equals  默认与 ==  是等价的,必须重写才能修改 hashCode () 
      

  27.   

    一般情况下,是要重写hashCode()的,但是也可以不这样的,因为一般类的对象比较用不到hashCode()方法
      

  28.   

    一般这种情况要看你重写equals()方法的这个object是用来做什么了! 要是你以后不会put到hashmap里的话 只是想做一下比较的话,就重写这一个方法就可以了!但是 当你要把这个对象作为hashmap的key值的时候, 你就必须的重写hashcode()了.
    因为hashmap是没有顺序的当你把一个新的对象传进去的时候,他会首先调用你的hashcode()把新传入的对象和以前存在hashmap理的对象进行比较,如果两个hashcod想等的话在进行equals比较,如果再次相等的话,那么新传进去的对象就要覆盖以前的那个了! 如果有任何一项不一样那就把新传入的对象添加到hashmap中去!
    我也是刚学java,刚好学到这里!这是我的理解!希望对你有帮助!
      

  29.   

    当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码