== 存在两种使用情况:
对于基本数据类型来说, 比较的是值是否相等。
对于引用数据类型来说, 比较的是内存地址是否相同。
equals()也存在两种使用情况:
情况 1:重写了 equals() 方法。一般来说,我们都会重写 equals() 方法来判断两个对象的内容是否相等,比如在 String 类【例如s[0].equals(“xxx”)表示一个字符串数组中的第一位对象的内容比较】
情况 2:没有重写 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过 == 比较这两个对象(比较的是地址)。
hashCode()方法返回的是哈希码:
实际上就是一个Java对象的内存地址,经过哈希算法,得出的一个值。若对比的是两个不同引用地址的对象,则会输出false。
拓展:
为什么在HashMap中要找到两个相同对象的时候需要重写equals方法同时重写hashcode?
首先我们需要理解hashmap的底层原理,在JDK1.8后,hashmap由数组和链表/红黑树组成。一个hashmap中相同index值的对象会存放在同一个链表中,当链表长度超过8时,引入红黑树的概念进行简化。如下图所示,引用自微信公众号:路人zhang。
因为首先如果我们不重写 hashCode(),那么任何对象的 hashCode() 值都不会相等。总体来说,HashMap 中get(key) 一个元素的过程是这样的,先比较 key 的 hashcode() 是否相等,若相等再通过 equals() 比较其值,若 equals() 相等则认为他们是相等的。若 equals() 不相等则认为他们不相等。
因此必须设计好一个hashcode值来得到index一组。(其实可以理解为核酸混采形成“桶”的概念来加快查找速度)然后再在组中进行重写的equals对相同的对象进行对比。



