区别
- == 一般用来比较对象的jvm地址是否一致,同对象相等(注意常量引用)
- equals 查看Object源码,默认直接调用==比较的也是对象地址,不同子类可以重写该方法,比如String
分两步
- 先比较对象地址
- 如果不是相同对象,则挨个比较字符串的每一个字符是否相同
3. hashcode 默认情况返回对象jvm32位存储地址
- 顺序表问题
对于顺序表,如数组,当查找元素时需要挨个遍历查询,线性查询效率很低
- 解决方案
已知在数组中,元素位置与index关联,与元素无关
如果将元素位置与元素构建某种关联,意味着每个元素只要保存到数据结构中,就能获取它的位置,位置已经被确定,查找效率更高。给每一个元素在表中确定一个唯一的位置的解决方案是散列表。
利用哈希函数,每一个元素能得到一个哈希值,根据哈希值在表中确认一个位置。(用例:查看hashmap源码可以发现hashmap根据哈希算法确定桶的位置)
重写equals
一般使用equals来比较两个对象是否等价,所以类都会重写equals
重写原则:
- 自反性,自己与自己比较为true
- 对 null,false
- 传递性,a与b相等,b与c相等,a与c一定相等
- 对称性,a与b相等,b与a相等
重写hashcode
为了遵守两个对象equals相同,hashcode也相同的规则,所以重写equals必须重写hashcode
注意事项:
- hashcode返回一个整型,防止溢出
- 不同对象的hashcode最好不同,为了提高hashmap等集合的效率,当出现哈希冲突时,根据hashmap的数据结构数组+链表(红黑树),会变成线性查询,效率降低
当User有重写equals和hashcode第二次结果为null