hashCode()
的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()
定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode()
函数。在我们编写程序的过程中,判断两个对象是否相同是十分常见且经常面对的一个问题。而 hashCode()
方法就是用来提升比较两个对象的速度的。
我们就以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
HashSet
时,HashSet 会先计算对象的 hashcode
值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode
值作比较,如果没有相符的 hashcode
, HashSet
会假设对象没有重复出现。hashcode
值的对象,这时会调用 equals()方法来检查 hashcode
相等的对象是否真的相同。如果两者相同, HashSet
就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。equals
的次数,相应就大大提高了执行速度。Java 对于 eqauls() 方法和 hashCode() 方法是这样规定的:
上面结论简记:
equals
的话,那么它们的 hashCode
值必然相等。如果只重写了 equals
方法,而不重写 hashCode
的方法,会造成 hashCode
的值不同,而 equals
方法判断出来的结果为true
。equals
的方法,而不重写 hashCode
的方法,Object中 hashCode
是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写 hashCode
方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。例如
Dog类
package com.xiao;
/**
* @author :小肖
* @date :Created in 2022/3/11 14:42
*/
public class Dog {
private String name;
private Integer age;
public Dog() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(obj.getClass() != getClass()){
return false;
}
Dog dog = (Dog) obj;
if(dog.getAge() == age && dog.getName().equals(name)){
return true;
}
return false;
}
}
测试类
import com.xiao.Dog;
public class Test {
public static void main(String[] args) {
Dog dog = new Dog("小旺",2);
Dog dog1 = new Dog("小旺",2);
System.out.println("equals结果:" + dog.equals(dog1));
System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
}
}
测试结果
equals结果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_56727438/article/details/123424045
内容来源于网络,如有侵权,请联系作者删除!