为什么重写equals必须重写hashcode方法

想必大家在平时的学习当中这个问题再熟悉不过了,但是为什么重写equals必须重写hashcode方法,很多程序员都不理解,今天来具体说说
——————————————————————————————————
首先,两个方法都是object类自带的原生方法方法:


image.png
  • equals 实现:
    image.png

用==比较(基本数据类型比较值是否相等,引用数据类型比较的是内存地址是否相等)
(注:这里的实现仅是object类的实现,这是基础)

  • hashcode实现
    image.png

这里用native修饰,说白了就是本地方法库里面用c++封装好的,不需要我们去关心(有兴趣的可以去github上面搜openjdk源码),我们可以理解:返回对象的内存地址的hashcode码,说白了在这里每个对象的hashcode码是不一样的(当然也有例外,在本篇无意义,不阐述)

—————————————————————————————————————

在我们开发中,重写了equals之后 ,不重写hahscode,程序依然不会报错
但是,java有条规定:

equals相等, hashcode一定相等;hashcode相等, equals不一定相等

java里面很多地方利用这条规定,先判断hashcode值是否相等,再去判断equals是否相等(为了提交效率),比如, hashmap,数组+链表中的链表比较就是利用先hashcode比较再equals比较,如果我们不重写hashcode的话,只重写equals方法,equals方法我们重写为只要对象里面某个值相等,就说明这个对象相等,比如下图,但是却没有重写hashcode,那么把该对象放入hashmap中,先利用hashcode比较两对象内存地址是否相等,hashcode肯定不相等的,但是这里equals相等的,这就和上面的这条规定相悖。

image.png

该class里面两个属性(name和age),我们重写equals方法,只要求name相等,则两对象相等,但是没有重写hashcode,放入hashmap则是两个对象。违背了java的原则(equals相等, hashcode一定相等;hashcode相等, equals不一定相等

你可能感兴趣的:(为什么重写equals必须重写hashcode方法)