hashMap存储结构(key为对象时 为什么要重写对象的hashCode() 和equal()方法

 

 

 解释:

在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

posted @ 2021-12-17 16:30  真理不真  阅读(276)  评论(0编辑  收藏  举报