“==” “equals()” “hashCode()” 傻傻分不清
简介
==
对于基本数据类型 byte、short、char、int、long、float、double,boolean,==
比较的是它们的值;而对于引用类型,如:类、接口、数组等,==
比较的是他们在内存中的存放地址。
equals()
默认情况下,equals
方法是调用 Object 类的 equals
方法,Object 的 equals
方法是用于判断对象的内存地址引用是不是同一个(是不是同一个对象);当然有一些类重写了 equals
方法,只进行内容的比较,如 String 类。
hashCode()
hashCode
方法采用哈希算法(哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上),返回的就是一个 hash 码,用途是在对对象进行散列的时候作为 key 输入,因此我们需要每个对象的 hash 码尽可能不同,这样才能保证散列的存取性能。
总结
-
equals
相等的两个对象,它们的hashCode
一定相等,反之不成立。 -
hashCode
方法只有在集合中用到。 -
String、Integer、Boolean、Double 等这些类都重写了
equals
和hashCode
方法,这两个方法是根据对象的内容来比较和计算hashCode
的。
为什么重写 equels
方法就必须重写 hashCode
方法?
1)根据定义,两个对象通过 equals
方法比较相等了,则其hashCode
方法返回的 hash 值一定要相等,则就必须重写 hashCode
方法,直接使用 Object 类的 hashCode
方法不一定相等。
2)当我们需要使用对象的 hash
值充当键值时,如 hashMap、hashSet 等来去重的时候,当两个对象通过 equals
方法比较相等后,但因为没重写 hashCode
方法可能会导致存进去与自身定义相等的两个对象。