Java|Java重写equals方法时为什么要重写hashCode方法( 二 )


Entry是一个静态内部类 , 有一个属性next , 指向下一个Entry , 形成一个链表结构 。
2、equals方法和hashCode方法看下面代码:
输出结果:
我们Student类重写了equals方法 , hashCode方法没有重写 , s1和s2的姓名和年龄相同 , equals方法为true , 认为是同一个人 。 但是s1和s2的hashCode返回不同 。
我们看下hashMap的get方法 , 先获取key的hashCode , 由于s1和s2的hashCode不同 , 所以hashMap.get(s2)得到的是null 。
接下来我们重写下Student类的hashCode方法 , 让equals方法和hashCode方法始终在逻辑上保持一致性 。
重新运行 , 输出结果如下 , s1和s2的hashCode相同了 , hashMap.get(s2)得到了1 。
① 在 Java 应用程序执行期间 , 在对同一对象多次调用 hashCode 方法时 , 必须一致地返回相同的整数 , 前提是将对象进行 equals 比较时所用的信息没有被修改 。 从某一应用程序的一次执行到同一应用程序的另一次执行 , 该整数无需保持一致 。
② 如果根据 equals(Object) 方法 , 两个对象是相等的 , 那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果 。
③ 如果根据 equals(java.lang.Object) 方法 , 两个对象不相等 , 那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果 。 但是 , 程序员应该意识到 , 为不相等的对象生成不同整数结果可以提高哈希表的性能 。
如果hashCode方法依赖于对象中易变的数据 , 用户就要当心了 , 因为此数据发生变化时 , hashCode()方法就会生成一个不同的hash值 。 看下面例子:
修改了age属性的值 , 导致hashCode变化 , 所以输出为“null” 。
因此 , 在设计hashCode方法和equals方法的时候 , 如果对象中的数据易变 , 则最好在equals方法和hashCode方法中不要依赖于该字段 。
欢迎小伙伴们关注转发点赞 , 谢谢~~


推荐阅读