Java之重写HashCode和equals
1.什么时候需要重写HashCode和equals方法?
当集合中需要判断元素是否相等时,需要重写元素中的HashCode和equals方法
2.为什么要有equal()和hashCode()方法
equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
所有对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性
3.重写equal()和hashCode()方法实例
public class Student
{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student() {
super();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
// 这里使用==显示判断比较对象是否是同一对象
if (this == obj)
return true;
// 对于任何非null的引用值x,x.equals(null)必须返回false
if (obj == null)
return false;
// 通过 getClass 判断比较对象类型是否相等
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
// 引入java8 Objects 如果两者相等,返回true(含两者皆空的情形),否则比较两者值是否相等
return Objects.equals(this.age, other.age) && Objects.equals(this.name, other.name);
}
}
Student s1 = new Student(null,2);
Student s2 = new Student(null,2);
if (s1.equals(s2))
{
System.out.println("s1等于s2");
}
else
{
System.out.println("s1不等于s2");
}