对于引用类型:==比较的是两个引用是否相同(所指的是否为同一个对象),注:如果两个引用所指的对象内容一样,但是不是同一个对象(hashcode不一样),依然返回false,随后引入了equals方法(比较的不是对象的地址,而是对象内容【当然前提是要重写equals和hashCode方法】
如果不重写Person类下的equals方法,则equals就等效于==,这里返回false(因为两个引用是不同的),如果Person类用了@Data注解(自动重写equals、hashCode、toString方法),则返回true(比较引用指向的地址的内容)
为什么使用equals方法要重写hashCode方法?
Java中任意一个对象都有native的hashCode方法,这个方法在散列集合中会用到,比如HashMap,在添加元素的时候会根据hashCode方法判断元素是否存在,如果存在的话,则再通过equals方法去比较是否是相同的对象,如果相同则直接替换,如果不同(说明发生了哈希冲突),则以链表的形式插入。
HashCode的值默认是JVM随机数生成的,即两个不同的对象,它们的hashcode值可能相同->
哈希冲突。两个相同的对象,它们的hashcode值一定相同,我们不需要考虑。
但两个不同的对象,它们的hashCode值可能相同,这是我们需要考虑的。
hashCode方法:快速定位该元素,在哈希表中是否存在以及存在的位置。
equals方法:比较两个对象是否相同(重写后的)
如果只重写equals不重写hashCode方法:
即使满足A.equals(B) 的两个相同的对象,依旧会被散列到不同的地方(因为hashcode不一样),会存在元素重复。
如果只重写haashCode方法不重写equals方法:
首先通过hashCode方法快速获取在集合中的位置,并且判断当前位置是否有元素存在,不存在的话没事,存在的话调用(没重写的)equals,即==。
综上所所,最好是equals方法和hashCode同时重写。