详解重写equals和hashcode
为什么要重写equals( )
判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象,这样我们往往需要重写equals()方法。
我们在向一个没有重复对象的集合中添加元素时,集合中存放的往往是对象,我们需要先判断集合中是否存在已知对象,这样就必须重写equals( )
怎样重写equals( )
重写equals( )必须遵循的要求如下:
1. 自反性: 对于任何非空引用x,x.equals(x)应该返回true。
2. 对称性: 对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3. 传递性: 对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4. 一致性: 如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5. 非空性: 对于任意非空引用x,x.equals(null)应该返回false。
1. 自反性原则
在JavaBean中,经常会覆写equals方法,从而根据实际业务情况来判断两个对象是否相等,比如我们写一个person类,根据姓名来判断两个person类实例对象是否相等。代码如下:
public class Person {
private String name;
public Person(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(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());
}
return false;
}
public static void main(String[] args){
Person p1=new Person("张三");
Person p2=new Person("张三 ");
List<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);
System.out.println("是否包含张三:"+list.contains(p1)); //true
System.out.println("是否包含张三:"+list.contains(p2)