📜  Java中的字段 hashCode() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:16:32.211000             🧑  作者: Mango

Java中的字段 hashCode() 方法及示例

在Java中,hashCode()方法是用于获取对象的哈希码(hash code)的方法,它返回一个整数,代表该对象在哈希表中的存储位置。hashCode()方法定义在Object类中,因此所有的Java对象都具有hashCode()的能力。在Java中,哈希表(hash table)是一种实现了映射(mapping)的数据结构,可以将键值(key-value)对映射到一个表中的位置,通过这个位置可以快速访问对应的值。

hashCode()方法的重要性

hashCode()方法在Java中非常重要,它最主要的作用是:

  • 作为哈希表(hash table)中对象的存储位置,可以使存储和查找元素的速度更快。
  • 当在使用集合(Collection)、Set、Map等集合类时,hashCode()方法可以用于判断对象是否相等,并且还可以用于确定对象的顺序。
hashCode()方法的实现原理

hashCode()方法的实现有一些规则,根据这些规则,我们可以很容易地为我们的类生成一个hashCode()方法:

  1. 在同一程序执行期间,只要对象的equals()方法的比较操作所用到的信息没有被修改,那么对这同一对象调用多次hashCode()方法都必须返回同一个整数值。
  2. 如果根据equals()方法,两个对象是相等的,那么调用这两个对象中任意一个对象的hashCode()方法都必须产生同样的整数结果。
  3. 如果根据equals()方法,两个对象不相等,那么调用这两个对象中任意一个对象的hashCode()方法,则不一定要产生不同的整数结果。
hashCode()方法的示例

下面是一个hashCode()方法的示例,我们可以看到,我们通常使用Object的hashCode()方法,但是如果我们自己定义了类,需要重写hashCode()方法:

public class Employee {
    private String name;
    private int age;
    private String department;

    // 构造函数
    public Employee(String name, int age, String department) {
        this.name = name;
        this.age = age;
        this.department = department;
    }

    // 重写hashCode()方法
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((department == null) ? 0 : department.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    // 重写equals()方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Employee other = (Employee) obj;
        if (age != other.age) {
            return false;
        }
        if (department == null) {
            if (other.department != null) {
                return false;
            }
        } else if (!department.equals(other.department)) {
            return false;
        }
        if (name == null) {
            if (other.name != null) {
                return false;
            }
        } else if (!name.equals(other.name)) {
            return false;
        }
        return true;
    }
}

在上面的代码中,我们定义了一个名为Employee的类,并定义了它的三个属性:name、age和department。在这个类中,我们重写了hashCode()方法和equals()方法。在hashCode()方法中,我们使用了Java中的一些运算符和操作,用于计算对象的哈希码。在equals()方法中,我们首先判断两个对象是否相等,如果相等则返回true,否则就用Java中的一些运算符和操作来判断两个对象是否相等。

使用Employee类的示例代码如下:

public class EmployeeTest {
    public static void main(String[] args) {
        Employee emp1 = new Employee("John", 30, "Engineering");
        Employee emp2 = new Employee("Jane", 35, "Sales");
        System.out.println("Employee 1 hashCode = " + emp1.hashCode());
        System.out.println("Employee 2 hashCode = " + emp2.hashCode());
        System.out.println("Employee 1 equals Employee 2? : " + emp1.equals(emp2));
    }
}

在上面的代码中,我们创建了两个Employee对象emp1和emp2,并输出了它们的哈希码。通过这个示例代码,我们可以看到,在默认情况下,Java会为每个对象生成一个唯一的哈希码。即使我们创建的两个Employee对象具有不同的属性,它们的哈希码也是不相同的。但是,在我们重写了hashCode()方法之后,同样的属性的对象就会有相同的哈希码了。