一、自反性原则 就是 x.equals(x) 必须为true
例子(不满足自反性原则的情况):
先写一个Person的实体类
Class Persion{
private String name;
private int age;
Person(String name){
this.name = name;
}
@Override
public boolean equals(Object obj){
if(obj instanceof Person){
Person person = (Person) obj;
return name.equalsIgnoreCase(person.getName().trim())
}
}
}
这个重新写的equals方法中 忽略了大小写和空格,
如果我new 一个 Person p1 = new Person("张三 ");带有空格的
然后p1.equals(p1) 这样的话就会返回的是false 这样的情况就是 不满足自反性
二、对称性
其实就是 如果 再new 一个 Person p2 = new Person("张三");
p1.equals(p2) 为true那么 p2.equals(p1) 就必须为true 反过来也是一样的
三、传递性
我们写一个 ExPerson 集成我们的类 并重写 euqals
public class ExPerson extends PersonEqualsOver{
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public ExPerson(String name,int id) {
super(name);
this.id = id;
// TODO Auto-generated constructor stub
}
@Override
public boolean equals(Object obj){
if(obj instanceof ExPerson){
ExPerson e = (ExPerson)obj;
return super.equals(obj) && e.getId() == id;
}
return super.equals(obj);
}
public static void main(String[] args) {
PersonEqualsOver p1 = new PersonEqualsOver("张三 ");
ExPerson p2 = new ExPerson("张三 ",15);
ExPerson p3 = new ExPerson("张三 ",12);
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p2.equals(p3));
}
}
结果是 true
true
false
说明传递性不满足,我们要这样去写
@Override
public boolean equals(Object obj){
if(obj !=null&& obj.getClass()==PersonEqualsOver.class)
if(obj instanceof PersonEqualsOver ){
PersonEqualsOver p = (PersonEqualsOver)obj;
//return name.equalsIgnoreCase(p.getName().trim());不满足自反性原则的例子 和对称性
return name.equalsIgnoreCase(p.getName());
}
return false;
}