重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“Java中的hashCode方法如何用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的hashCode方法如何用”文章能帮助大家解决问题。
创新互联主要从事网站设计制作、成都网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务京口,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
hashCode()
的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()
定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode()
函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)。
在我们编写程序的过程中,判断两个对象是否相同是十分常见且经常面对的一个问题。而 hashCode()
方法就是用来提升比较两个对象的速度的。
我们就以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当你把对象加入 HashSet
时,HashSet 会先计算对象的 hashcode
值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode
值作比较,如果没有相符的 hashcode
, HashSet
会假设对象没有重复出现。
但是如果发现有相同 hashcode
值的对象,这时会调用 equals()方法来检查 hashcode
相等的对象是否真的相同。如果两者相同, HashSet
就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
这样我们就大大减少了 equals
的次数,相应就大大提高了执行速度。
Java 对于 eqauls() 方法和 hashCode() 方法是这样规定的:
同一对象上多次调用 hashCode() 方法,总是返回相同的整型值。
如果 a.equals(b),则一定有 a.hashCode() 一定等于 b.hashCode()。
如果 !a.equals(b),则 a.hashCode() 不一定等于 b.hashCode()。此时如果 a.hashCode() 总是不等于 b.hashCode(),会提高 hashtables 的性能。
a.hashCode()==b.hashCode() 则 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 则 a.equals(b) 为假。
上面结论简记:
如果两个对象 equals,Java 运行时环境会认为他们的 hashCode 一定相等。
如果两个对象不 equals,他们的 hashCode 有可能相等。
如果两个对象 hashCode 相等,他们不一定 equals。
如果两个对象 hashCode 不相等,他们一定不 equals。
我们上面讲解到 如果 两个对象 equals
的话,那么它们的 hashCode
值必然相等。如果只重写了 equals
方法,而不重写 hashCode
的方法,会造成 hashCode
的值不同,而 equals
方法判断出来的结果为true
。
在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了 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
关于“Java中的hashCode方法如何用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注创新互联行业资讯频道,小编每天都会为大家更新不同的知识点。