==、equals、hashcode总结

162 阅读2分钟

区别

  1. == 一般用来比较对象的jvm地址是否一致,同对象相等(注意常量引用)
  2. equals 查看Object源码,默认直接调用==比较的也是对象地址,不同子类可以重写该方法,比如String


分两步

  • 先比较对象地址
  • 如果不是相同对象,则挨个比较字符串的每一个字符是否相同

  3. hashcode 默认情况返回对象jvm32位存储地址

  • 顺序表问题

对于顺序表,如数组,当查找元素时需要挨个遍历查询,线性查询效率很低

  • 解决方案

已知在数组中,元素位置与index关联,与元素无关

如果将元素位置与元素构建某种关联,意味着每个元素只要保存到数据结构中,就能获取它的位置,位置已经被确定,查找效率更高。给每一个元素在表中确定一个唯一的位置的解决方案是散列表。

利用哈希函数,每一个元素能得到一个哈希值,根据哈希值在表中确认一个位置。(用例:查看hashmap源码可以发现hashmap根据哈希算法确定桶的位置)

重写equals

一般使用equals来比较两个对象是否等价,所以类都会重写equals

重写原则:

  1. 自反性,自己与自己比较为true
  2. 对 null,false
  3. 传递性,a与b相等,b与c相等,a与c一定相等
  4. 对称性,a与b相等,b与a相等

重写hashcode

为了遵守两个对象equals相同,hashcode也相同的规则,所以重写equals必须重写hashcode

注意事项:

  1. hashcode返回一个整型,防止溢出
  2. 不同对象的hashcode最好不同,为了提高hashmap等集合的效率,当出现哈希冲突时,根据hashmap的数据结构数组+链表(红黑树),会变成线性查询,效率降低


当User有重写equals和hashcode第二次结果为null