对于Java中==、equals()和hashCode()的理解

==和equals()的区别

==:基本数据类型比较的是值,引用数据类型比较的是内存地址;
equals():
1.类没有重写equals()方法时,等价于" == ";
2.类重写了equals()方法时,一般是重写用来比较对象的内容。
比如:经常使用的String类型数据中equals()方法是用来判断字符串值是否相等(String类中的equals()方法是被重写过的,而Object类的equals()是比较对象的内存地址)

hashCode ()

hashCode()的作用是获取对象的哈希码(实际上是一个int整数),这个哈希码的作用就是确定对象在哈希表(散列表,key-value键值对形式)中的索引位置;
1.如果两个对象相等,那么它们的hashCode()值一定要相同;
2.如果两个对象hashCode()相等,它们并不一定相等。
注意:这是在散列表中的情况。在非散列表中一定如此!

为什么重写 equals 时必须重写 hashCode方法?

在HashSet中操作对象,如果对象类中不重写hashCode⽅法,新建对象的hashCode都会不同,HashSet里面会出现重复对象
这点可以体现在HashSet去重原理,当你把对象加⼊ HashSet时,HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与该位置其他已经加⼊的对象的 hashcode 值作⽐对,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() ⽅法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加⼊操作成功。如果不同的话,就会重新散列到其他位置。(《Head first java》第⼆版)。这样我们就⼤⼤减少了 equals 的次数,相应就⼤⼤提⾼了执⾏速度。

猜你喜欢

转载自blog.csdn.net/weixin_43278644/article/details/110739293
今日推荐