软件构造Lab4实验总结—equals()和hashCode()
程序员文章站
2024-02-09 18:10:04
...
在实验四debug修正完善过程中,发现自己的代码中很多类都只写了equals()方法,却没有完成hashCode()方法,故对这两个方法进行学习并在此进行记录。
1、简单概念
hashCode()方法与equals()方法作用相同,都是用来比较两个对象是否一致,而相比于equals()较复杂的实现,hashCode()只要return一个hash值即可实现比较,效率无疑高了很多,之所以在类中需要把两个方法均Override,其原因主要是根据hashCode()的返回值定义,不同的对象也有可能有相同的返回值,所以这个方法并不是一定可靠,然而equals()方法对两个对象的所有内容进行比较,其结果也是可靠的。因此我们可以得出:equal()相等的两个对象他们的hashCode()肯定相等,hashCode()相等的两个对象他们的equal()不一定相等。 因而对于需要大量并且快速的对比的话如果都用equal()去做显然效率太低,所以每当需要对比的时候,先用hashCode(),如果返回值不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象一定相同,这样既提高了效率也保证了正确性。
2、具体实现
因为较为简单,所以直接上代码,对于我使用过的IDEA和eclipse两个IDE,这两种方法的Override都是可以通过编译器自动生成的。
public class Student {
private int age;
private String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
System.out.println("hashCode : "+ result);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}