qq_39632416
yunyunTest
2017-08-11 04:50
采纳率: 64.7%
浏览 2.3k
已采纳

为什么要重写hashcode方法

我看老师新建类的时候比如student类这样总是要重写hashcode和equals方法,但是他说还不重写也行,没搞懂

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • u014332200
    Coding Sir 2017-08-12 14:56
    已采纳

    如果该类需要使用HashSet或者HashMap等集合存储时,需要重写。引用哈希散列算法会先根据哈希值验证是否一样,如果一样再调用equals

    点赞 评论
  • Small_Mouse0
    鼠小 2017-08-11 05:18

    主要原因是默认从Object继承来的hashCode是基于对象的ID实现的。

    如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。
    这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

    点赞 评论
  • dcxy0
    Q544471255 2017-08-11 05:23

    参考:http://tool.oschina.net/apidocs/apidoc?api=jdk-zh

    下面的两个方法来自:java.lang.Object 类.

     equals
    
    public boolean equals(Object obj)
    指示其他某个对象是否与此对象“相等”。
    equals 方法在非空对象引用上实现相等关系:
    
    自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
    对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
    传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
    一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
    对于任何非空引用值 x,x.equals(null) 都应返回 false。
    Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
    
    注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
    
    参数:
    obj - 要与之比较的引用对象。
    返回:
    如果此对象与 obj 参数相同,则返回 true;否则返回 false。
    另请参见:
    hashCode(), Hashtable
    
    
    // hashCode------------------------------------------------
    
    hashCode
    
    public int hashCode()
    返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
    hashCode 的常规协定是:
    
    在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
    如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
    如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
    实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)
    
    返回:
    此对象的一个哈希码值。
    另请参见:
    equals(java.lang.Object), Hashtable
    
    
    点赞 评论
  • yu_duan_hun
    yu_duan_hun 2017-08-11 06:06

    两个对象a.equals(b)中,equals判断是否相同,hashCode相当于对象索引,索引相同会放在同一个链表中,效率会变差。如果你不需要判断两个对象相等,可以不写。或者不需要hashcode,可以自己写个方法:
    public boolean isEquals(Student stu){
    if(stu.getId()==getId)
    return true;
    return false;
    }

    点赞 评论
  • Java_Dmz
    盗墓者是个丑奴儿 2017-08-15 02:22

    equals对象做比较,hashCode计算int值并返回,你们老师老是要重写是因为:所有类默认继承父类Object,想比较想计算值,就按照父类的规范重写,这个叫主流
    如果你们在教学阶段,那倒不必重写,因为仅仅是学习,没必要没创建一个类就重写又不是做项目做例题,额,你们老师没将清楚把,

    点赞 评论

相关推荐