还要重写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.
只知道要重写的话
这两个都要重写
是建议要重写....
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.
但是这一点不是必须的,你可以认为是“强烈建议”吧,毕竟,在实际使用当中,如果你的类被其他人使用,而你只改写了两个方法中的一个,打破了“equal的对象有相同的hash codes”这个惯例,别人使用的时候可能会因为调用了这两个方法而导致同样的逻辑产生不同的结果。
重写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()会理想些,素数越大越理想.
欢迎拍砖.
hashCode():返回该对象的哈希码值
hashCode 的常规协定是: 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。
hashCode对比object的同一性。equals和hashCode结果很像,但是,严格上讲,根本就是两种东西。
overwrite equals方法,并没有overwrite hashCode的义务,就算overwrite hashCode,JVM中间已经定义了严格的对比方法,你要复写什么?
相比equals的overwrite,特别是对于bean的值对比往往需要自己overwrite
你如果自己比较对象,通常一定是会使用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()判断相等。(这种情况在复杂一点的算法中恰恰经常存在。)
17楼的观点错误。overwrite equals()方法,就有义务overwrite hashCode()方法。这是JavaDoc里面明确说明的。
看了楼下的帖子,知道了equals()和hashCode()的关系
重写主要是为了维护已有的约定!学习了~
equals方法主要用于集合类中,用于判断两个对象是否相等。
hashCode方法用于HashSet,HashMap的哈希函数。
当没重载这两个方法,把对象放到容器中,会出现意想不到的问题。 你还可以重载toString()方法,用于将对象显示出字符串。System.out.println(myclass). 还有clone方法也可以考虑重载,如有必要。
以下这段文字摘自Think In Java: 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:
equals()
hashCode()
toString()
clone()(implement Cloneable)
implement Serializable
只需保证两个equals()为true的对象的hashCode()码相同即可。这就是所谓的一致或联动规范。
其实我觉得hashcode是一种equals用来比较两个对像是否相等的凭据
object中的hashcode实际上对象在内存中的地址,如果自己的类不重
写的话,就会按照地址比较,结果2个对象通常不等,除非指向同一
地址,
所以实际上hashcode是给你一种自己定义比较方式的权利,他是
要生成散列码,自己定义的时候,一定要确保散列码尽可能的唯一,
那样才有意义比如 字符串“abc”和“bac”生成的散列码要不同
因为hashmap是没有顺序的当你把一个新的对象传进去的时候,他会首先调用你的hashcode()把新传入的对象和以前存在hashmap理的对象进行比较,如果两个hashcod想等的话在进行equals比较,如果再次相等的话,那么新传进去的对象就要覆盖以前的那个了! 如果有任何一项不一样那就把新传入的对象添加到hashmap中去!
我也是刚学java,刚好学到这里!这是我的理解!希望对你有帮助!