java判断两个对象是否是同一个对象

比较两个对象是否相等,主要通过equals()和hashCode()

  • equals()方法
  • hashCode()方法
  • equals()和hashCode()在hashSet中使用

一、equals()

equals()是Object中的方法,比较的对象的内存地址(如图一)。

Object源码

但是也有的类重写了equals()方法,比较的内容是否相等。例如:String 、Math、Integer、Double等

String源码

 

二、hashCode()

比较的哈希码中的索引位置。可以快速定位对象的物理位置,能提高查找效率。

equals()相等,hashCode()一定相等
hashCode()不相等,equals()一定不相同
hashCode()相等,equals不一定相等

三、equals()和hashCode()

在hashSet中使用,hashset是元素无序,不重复的集合。

先有一个例子看一下其实hashSet也是可以添加重复元素的。

输出结果:

看这个结果hashSet无序倒是体现出来了,但是里面为什么被添加了重复元素?难道是hashSet元素不可以重复是错误?当然不是啦!首先我们分析一下hashSet中我们是怎么添加元素的,由上图可见我们每次添加的对象都是new出来的,使用new就是创建一个对象,既然每次都创建了一个新的对象,hashCode()可能就不相同,hashSet自然就把他们当做不同对象添加到集合里面啦。那么对于自定义对象我们才能保持不重复呢?如下:

重写自定义对象的equals()和hashCode()后

输出:问题解决