详解Java的hashCode()方法:返回当前对象的哈希码

  • Post category:Java

Java中的hashCode()方法是用于获取对象的哈希值(Hash值)的方法,它通常和equals()方法一起被重写,用于判断两个对象是否相等。下面详细讲解Java的hashCode()方法的完整攻略:

什么是哈希值?

哈希值是由一个对象的状态值算出来的一个值, 值得是一个固定长度的整型数值。可以将一个对象的哈希值看做是该对象的摘要或指纹,它本质上是一个数字签名,该数字签名具有唯一性和不易被篡改性。

hashCode()方法的定义

hashCode()方法是Object类的一个方法,如果没有被覆盖,hashCode方法返回的是对象的存储地址,即每个对象都不同,因为每个对象的存储地址都不同。一般情况下,我们需要重写该方法来适应自己的需求。

hashCode()方法的原理

hashCode方法返回的是一个int类型的整数,它和equals方法是密切相关的。hashCode方法的实现需要根据对象的内容动态计算出一个int类型的数值,这个数值被用于确定该对象在哈希表中的索引位置,这个索引位置就是用来存储对象的物理地址。

hashCode()方法的重写

实际使用中,equals方法和hashCode方法必须同步重写,重写规则如下:

  1. 如果两个对象相等,则哈希值必须相同;

  2. 如果两个对象的哈希值相等,则它们并不一定相等。

重写完整代码如下:

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()方法的完整攻略,希望对你有所帮助。