📜  Java中的可选 hashCode() 方法及示例(1)

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

Java中的可选 hashCode() 方法及示例

在Java中,Object类中定义了hashCode()方法,该方法会返回当前对象的散列码(哈希值),用于在哈希表中存储对象时快速查找。但是在某些情况下,我们可能需要重写hashCode()方法。

默认hashCode()方法

默认的hashCode()方法实现是将对象的内存地址转换为哈希值。例如:

Object obj1 = new Object();
Object obj2 = new Object();

System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());

输出结果:

113904611
1627674070
为什么需要重新实现hashCode()方法

如果不重写hashCode()方法,我们可能会遇到以下问题:

  1. 不同对象返回的哈希值相同:如果我们自己封装的类没有重写hashCode()方法,则每个实例对象都有不同的内存地址,但是默认的hashCode()方法可能会产生重复的哈希值,从而导致哈希表中发生冲突,影响查找性能。

  2. 有时需要将对象作为哈希表的键:哈希表中的键必须具有可比性和唯一性,如果不重写hashCode()方法,则可能导致一些对象的哈希值相同,从而无法存储到哈希表中。

重新实现hashCode()方法

重新实现hashCode()方法的规则是:

  1. 如果两个对象equals()方法返回true,则它们的hashCode()方法必须返回相同的哈希值。

  2. 如果两个对象equals()方法返回false,则它们的hashCode()方法不要求返回不同的哈希值。但是,为了提高哈希表的性能,最好在可能情况下让不同的对象返回不同的哈希值。

下面是一个例子,实现了一个Person类,重写其hashCode()方法:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + age;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (obj.getClass() != getClass()) {
            return false;
        }
        Person other = (Person)obj;
        return name.equals(other.name) && age == other.age;
    }
}

在这个例子中,我们将Person类的hashCode()方法的实现基于nameage变量计算得出,这样能够保证nameage相同的Person对象返回相同的哈希值,从而在哈希表中进行查找时可以快速找到对应的对象。

总结

在Java中,hashCode()方法是一种用于快速查找对象的技术。在某些情况下,我们需要重新实现hashCode()方法,以保证对象的哈希值在哈希表中唯一并且快速查找。当我们需要用对象作为哈希表的键时,更是需要重新实现hashCode()方法以确保唯一性和可比性。