Java中的hashCode()方法是用于获取对象的哈希值(Hash值)的方法,它通常和equals()方法一起被重写,用于判断两个对象是否相等。下面详细讲解Java的hashCode()方法的完整攻略:
什么是哈希值?
哈希值是由一个对象的状态值算出来的一个值, 值得是一个固定长度的整型数值。可以将一个对象的哈希值看做是该对象的摘要或指纹,它本质上是一个数字签名,该数字签名具有唯一性和不易被篡改性。
hashCode()方法的定义
hashCode()方法是Object类的一个方法,如果没有被覆盖,hashCode方法返回的是对象的存储地址,即每个对象都不同,因为每个对象的存储地址都不同。一般情况下,我们需要重写该方法来适应自己的需求。
hashCode()方法的原理
hashCode方法返回的是一个int类型的整数,它和equals方法是密切相关的。hashCode方法的实现需要根据对象的内容动态计算出一个int类型的数值,这个数值被用于确定该对象在哈希表中的索引位置,这个索引位置就是用来存储对象的物理地址。
hashCode()方法的重写
实际使用中,equals方法和hashCode方法必须同步重写,重写规则如下:
-
如果两个对象相等,则哈希值必须相同;
-
如果两个对象的哈希值相等,则它们并不一定相等。
重写完整代码如下:
public class Student {
private String name;
private int age;
private String school;
//省略setter和getter方法
@Override
public int hashCode() {
int result = 17;
result = result * 31 + name.hashCode();
result = result * 31 + age;
result = result * 31 + school.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (!(obj instanceof Student)) return false;
Student s = (Student) obj;
return this.name.equals(s.name) && this.age == s.age && this.school.equals(s.school);
}
}
在这个例子中,我们通过调用String的hashCode()方法,将学生的姓名和学校的哈希值计入计算结果中,同时将学生的年龄的值也计入到计算结果中,以确保对于不同的学生,它们的哈希值不同。这时我们只需要调用student1.equals(student2)方法就能比较两个学生是否相等。
hashCode()方法的示例
下面是一个例子,通过HashMap存储Student对象,使用hashCode()方法规避key值相同的问题。
import java.util.HashMap;
public class Test {
public static void main(String[] args) {
Student stu1 = new Student("Tom", 20, "MIT");
Student stu2 = new Student("Tom", 20, "Beijing University");
Student stu3 = new Student("Jerry",20,"MIT");
HashMap<Student, String> map = new HashMap<>();
map.put(stu1, "Java");
map.put(stu2, "C++");
map.put(stu3, "Python");
System.out.println(map.size());
}
}
由于stu1和stu2的hashCode是相等的,但与stu3的hashCode不同,所以HashMap中只会存储两个元素,结果为2。
以上就是对Java的hashCode()方法的完整攻略,希望对你有所帮助。