解释:
在HashMap中,如果key为类对象,则必须要重写hashCode() 和equal()这两个方法。 Why? 首先了解下未被重写的hashCode() 和equal()方法。
1.未被重写的hashCode() 和equal()方法
HashCode是根类Obeject中的方法。如果对象不重写该方法,默认情况下 返回相应对象的32为JVM内存地址。
equals()用于比较两个对象是否相同,它其实就是使用两个对象的内存地址在比较。Object类中的equals方法内部使用的就是 == 比较运算符。
2.在HashMap中,判断两个对象(key)是否相等的规则:
2.1.判断两个对象的hashCode()是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2.2
2.2.判断两个对象的equals()是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
3.为什么重写hashCode方法?
一般的地方不需要重写hashCode(),只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重写hashCode(),那么为什么要重写hashCode()呢?
如果不重写hashCode()方法,由于两个对象实例的内存地址不同,根据2.1,则判为不等。
重写之后,hashCode()方法变成判断其逻辑上是否相同,根据2.1,则判为相等。
4.为什么要重写equal方法?
因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重写equal方法。
5. 为什么string 不需要重写hashcode和equals方法?
String 对象底层是一个 final 修饰的 char 类型的数组,hashCode() 的计算是根据字符数组的每个元素进行计算的,所以内容相同的 String 对象会产生相同的散列码。
而非 String类型的对象 在获得对应的 value 时需要的条件太过苛刻,首先要保证散列码相同,并且经过 equals() 方法判断为 true 时才可以获得对应的 value