📅  最后修改于: 2023-12-03 15:31:58.425000             🧑  作者: Mango
在Java中,Object
类中定义了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()
方法,则每个实例对象都有不同的内存地址,但是默认的hashCode()
方法可能会产生重复的哈希值,从而导致哈希表中发生冲突,影响查找性能。
有时需要将对象作为哈希表的键:哈希表中的键必须具有可比性和唯一性,如果不重写hashCode()
方法,则可能导致一些对象的哈希值相同,从而无法存储到哈希表中。
重新实现hashCode()
方法的规则是:
如果两个对象equals()
方法返回true
,则它们的hashCode()
方法必须返回相同的哈希值。
如果两个对象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()
方法的实现基于name
和age
变量计算得出,这样能够保证name
和age
相同的Person
对象返回相同的哈希值,从而在哈希表中进行查找时可以快速找到对应的对象。
在Java中,hashCode()
方法是一种用于快速查找对象的技术。在某些情况下,我们需要重新实现hashCode()
方法,以保证对象的哈希值在哈希表中唯一并且快速查找。当我们需要用对象作为哈希表的键时,更是需要重新实现hashCode()
方法以确保唯一性和可比性。