对于equals方法的编写需要满足如下要求:
- 自反性(Reflexive):对于非
null
的x
来说,x.equals(x)
必须返回true
; - 对称性(Symmetric):对于非
null
的x
和y
来说,如果x.equals(y)
为true
,则y.equals(x)
也必须为true
; - 传递性(Transitive):对于非
null
的x
、y
和z
来说,如果x.equals(y)
为true
,y.equals(z)
也为true
,那么x.equals(z)
也必须为true
; - 一致性(Consistent):对于非
null
的x
和y
来说,只要x
和y
状态不变,则x.equals(y)
总是一致地返回true
或者false
; - 对
null
的比较:即x.equals(null)
永远返回false
。
对于两个字段的比较:
如果是两个引用类型,那么我们使用equals方法进行比较,如果是两个基本数据类型的字段,则我们可以使用 == 进行比较
发现:
public class Test2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
list.add(30);
Integer value = new Integer(10);
System.out.println(list.contains(value));;//true
}
}
我们上面段代码会打印一个true,但是很明显,我们的value是new出来的,他虽然也是10,但是和List集合中的10明显就是两个东西,但是结果还是现实的true。这是因为他们里面比较的时候,不是用的“==”来比较,而是使用的equals方法进行比较。
public class Test2 {
public static void main(String[] args) {
Dog dog1 = new Dog("二哈");
Dog dog2 = new Dog("阿拉斯加");
ArrayList<Dog> list = new ArrayList<>();
list.add(dog1);
list.add(dog2);
Dog dog3 = new Dog("二哈");
//false
System.out.println(list.contains(dog3));
}
}
上面这段代码,的结果是false,因为dog类中没有覆写equals方法;
对于LIst中,如果我们要使用indexOf或者contains方法的时候,我们应该要覆写equals方法,让他们能够正确使用。这里我们能够正确显示是因为,integer和string这些类型,Java已经帮我们正确的实现了equals方法。
如上图,这个是integer中覆写的equals方法。
如果我们自己写的类,比如person类,当我们使用List装载person类的时候,要是使用contains或者是indexOf方法的时候,我们就应该在person类中覆写equals方法。