Java双等号,Equals(),HashCode()小结

Posted MaxStack

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java双等号,Equals(),HashCode()小结相关的知识,希望对你有一定的参考价值。

默认情况 

- 双等号==,比较的是内存地址。
- equals(),默认比较的是内存地址。
- hashCode(),默认返回的是object的内存地址。

String中方法改写的情况

经常会遇到需要override equals()和hashCode()的情况,比如String就改写了这两个方法。
 
String equals() 的实现是首先判断两个字符串内存空间是否一致,然后对每一位字符进行比较。
String hashCode() 的实现是对每一位字符*31然后累加。

Equals()和HashCode()的契约

Java中两者有一个契约:
- 如果两个对象相等的话,即equals()返回true的时候,它们的hashCode()必须相等。
- 但如果两个对象的hashCode()相等的话,这两个对象(用equals()判断)不一定相等。
 
举例来说,在HashMap中存取键值对的时候用到了这两个方法:
- 用hashCode()计算Entry在数组中的位置
- 可能出现碰撞的情况,即多个Entry的hash code相同,存在同一个”格”中
- 这时,需要用equals()来判断key是否相同
 
一般来说equals()和hashCode()的override都是绑定出现的,因为要保证上述的契约关系。

参考

以上是关于Java双等号,Equals(),HashCode()小结的主要内容,如果未能解决你的问题,请参考以下文章

java中equals,hashcode和==的区别

java中equals,hashcode和==的区别(转)

学习笔记------- ==   equals   hashcode

hashMap的原理 深入理解

(转)java中equals和等号(==)的区别浅谈

根据你的理解,简要说明使用双等号(==)和equals()方法判断两个字符串是不是相等有啥区别