1,java重写equals方法需要注意的几点
2,必须要重写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。
重写hashCode()的原则
(1)同一个对象多次调用hashCode()方法应该返回相同的值;
(2)当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()应该返回相等的(int)值;
(3)对象中用作equals()方法比较标准的Filed(成员变量(类属性)),都应该用来计算hashCode值。
demo
import java.util.ArrayList;
import java.util.List;
public class Person {
private String name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Person))
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public Person(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void main(String[] args){
Person p1=new Person("张三");
Person p2=new Person("张三 ");
Person p3=new Person("lisi");
Person p4=new Person("张三");
Person p5=new Person(null);
List<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);
list.add(p5);
System.out.println("是否包含张三:"+list.contains(p1));
System.out.println("是否包含张三:"+list.contains(p2));
System.out.println("是否包含张三:"+list.contains(p3));
System.out.println("是否包含张三:"+list.contains(p4));
System.out.println("是否包含null:"+list.contains(p5));
System.out.println("Person.hashcode"+p1.hashCode());
System.out.println("Person.hashcode"+p2.hashCode());
System.out.println("Person.hashcode"+p3.hashCode());
System.out.println("Person.hashcode"+p4.hashCode());
System.out.println("Person.hashcode"+p5.hashCode());
}
}