![ed2b8d1e258f506f30c341b7c4191818.png](https://img-blog.csdnimg.cn/img_convert/ed2b8d1e258f506f30c341b7c4191818.png)
Java里面equals是Obect类里面定义的方法,今天我们就来研究一下equals的作用。equals的作用
Java里的equals是用来判断两个对象之间是否相等。
equals需要满足下列条件:
自反性:对于非空a,a.equals(a)总是为true
对称性:对于非空的a、b,如果a.equals(b)为true,则b.equals(a)也为true
传递性:对于非空的a、b、c,如果a.equals(b)为true,b.equals(c)为true,则a.equals(c)也为true
一致性:对于非空的a、b,只要a、b未发生改变,a.equals(b)总是返回true或者false
非空性:对于非空的a,a.equals(null)一定为false
我们来看下Obejct的equals实现:
public
可以看到,默认的情况下equals就是比较两个的==操作。那么==操作是比较什么呢?
- 对于基本类型(int,byte,boolean,long,short,double,float,char),==操作比较值相等
- 对于对象类型,比较两个对象的内存地址。
- 对于封装类型和基本类型间的比较,编译器会转换为基本类型后再比较
下面这个对于某些人来说可能是个世界难题,
@Test
所以我们可以很简单的得出:
@RunWith
我们尝试着重新equals方法
@AllArgsConstructor
可以看到,我们做了很多额外的检查,来保证这两个相等性,我们的junit
@Test
我们可以用EqualsBuilder来快速重写equals方法
public
更简单的,如果我们使用lombock,可以直接添加,
@AllArgsConstructor
注意,这边会同时重写hashCode,在下面的集合测试里我们不会使用这种方式,会影响Hash类型的集合的结果。
在java里面很多类都重写了equals,比如String类的
public
equals在集合里的作用
@Test
可以看到,在使用HashSet的时候,尽管我们的equals是返回相同的对象,但是运行结果依旧是false。有关这部分的知识我们会留到HashCode的部分加以说明。