java中重写=和重写hashCode ()

  

<强> java中重写=和重写hashCode()

  

记得在刚上初一的时候,第一堂数学课学的是集合,那时候我知道了集合是不允许重复元素存在的。

  

hashCode方法用于散列集合的查找,等于方法用于判断两个对象是否相等。

  

为什么重写了等于方法,还要重写hashCode方法?
  

  

因为如果只重写了等于方法,两个对象=返回了没错,但是如果没有重写hashCode方法,集合还是会插入元素。这样集合中就出现了重复元素了。

  

接下来详细分析,以HashMap的把方法:

        公共V把(K键,V值){      如果(键==null)   返回putForNullKey(价值);//通过关键的hashcode计算的哈希值   int散列=散列(key.hashCode ());//通过哈希值和表数组的长度计算出元素存放数在表组的位置   int i=indexFor(散列,table.length);//表[我]的位置已经存在元素,遍历链表   (Entrye=表(我);e !=零;e=e.next) {   对象k;//调用=方法判断键是否相等,若相等,该密钥对应的键值对已经存在,用新取的值代旧的价值   如果(e。散列==散列,,((k=e.key)==关键| | key.equals (k))) {   V oldValue=https://www.yisu.com/zixun/e.value;   e。值=价值;   e.recordAccess(这个);   返回oldValue;   }   }      modCount + +;//若该密钥对应的键值对不存在,将键值封装成条目对象添加到表[我]处,头插法。   addEntry(散列、关键值,我);   返回null;   }      之前      

1。HashMap的把方法实际上是先调用hashCode定位到数组的位置
  

  

2。如果该数组的位置上已经存在元素了,即表[我]!=零,那么遍历链表,调用=方法判断键是否相等。如果相等,表明这个关键对应的键值对已经存在,那么新的价值会覆盖掉旧的价值。如果遍历链表都没有找到钥匙,那么表明这个关键对应的键值对不存在,直接插入,作为链表的头节点。
  

  

<强>总结

  
      <李>往HashMap添加元素的时候,需要先定位到在数组的位置(hashCode方法)。   <李>如果只重写了等于方法,两个对象=返回了真的,集合是不允许出现重复元素的,只能插入一个。   <李>此时如果没有重写hashCode方法,那么就无法定位到同一个位置,集合还是会插入元素。这样集合中就出现了重复元素了。那么重写的=方法就没有意义了。   
  

如下图:
  

  

癹ava中重写=和重写hashCode

  

如果重写了hashcode方法,确保两个对象都能够定位到相同的位置,那么就可以遍历这条单向链表,使用=方法判断两个对象是否相同,如果相同,那么就不插入了(HashMap的实现仍然插入,但是覆盖掉旧的值)。如果不相同,就插入到链表的头节点处。

  

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java中重写=和重写hashCode ()