我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java中hashCode的作用是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java中hashCode的作用是什么

本篇文章给大家分享的是有关Java中hashCode的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

  1. hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。   

  2.   

  3. hashCode 的常规协定是:   

  4. 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。   

  5. 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。   

  6. 以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。   

  7. 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)   

  8.   

  9. 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。  


以上这段官方文档的定义,我们可以抽出成以下几个关键点:

hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;

如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;

如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;

两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”

再归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的。以下这段话是从别人帖子回复拷贝过来的:

  1. hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有  

  2. 例如内存中有这样的位置  

  3. 0  1  2  3  4  5  6  7    

  4. 而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。  

  5. 但如果用hashcode那就会使效率提高很多。  

  6. 我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。  

  7.   

  8. 但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。  

  9. 也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。  

  10. 那么。重写了equals(),为什么还要重写hashCode()呢?  

  11. 想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊  


最后,我们来看一个具体的示例吧,

  1. public class HashTest {  

  2.     private int i;  

  3.   

  4.     public int getI() {  

  5.         return i;  

  6.     }  

  7.   

  8.     public void setI(int i) {  

  9.         this.i = i;  

  10.     }  

  11.   

  12.     public int hashCode() {  

  13.         return i % 10;  

  14.     }  

  15.   

  16.     public final static void main(String[] args) {  

  17.         HashTest a = new HashTest();  

  18.         HashTest b = new HashTest();  

  19.         a.setI(1);  

  20.         b.setI(1);  

  21.         Set<HashTest> set = new HashSet<HashTest>();  

  22.         set.add(a);  

  23.         set.add(b);  

  24.         System.out.println(a.hashCode() == b.hashCode());  

  25.         System.out.println(a.equals(b));  

  26.         System.out.println(set);  

  27.     }  

  28. }  

这个输出的结果: copy

  1. true  

  2. false  

  3. [com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]  

以上这个示例,我们只是重写了hashCode方法,从上面的结果可以看出,虽然两个对象的hashCode相等,但是实际上两个对象并不是相等;,我们没有重写equals方法,那么就会调用object默认的equals方法,是比较两个对象的引用是不是相同,显示这是两个不同的对象,两个对象的引用肯定是不定的。这里我们将生成的对象放到了HashSet中,而HashSet中只能够存放唯一的对象,也就是相同的(适用于equals方法)的对象只会存放一个,但是这里实际上是两个对象a,b都被放到了HashSet中,这样HashSet就失去了他本身的意义了。

此时我们把equals方法给加上:

  1. <span style="color:#3366FF;">public boolean equals(Object object) {  

  2.         if (object == null) {  

  3.             return false;  

  4.         }  

  5.         if (object == this) {  

  6.             return true;  

  7.         }  

  8.         if (!(object instanceof HashTest)) {  

  9.             return false;  

  10.         }  

  11.         HashTest other = (HashTest) object;  

  12.         if (other.getI() == this.getI()) {  

  13.             return true;  

  14.         }  

  15.         return false;  

  16.     }  


此时得到的结果就会如下:ew plain copy

  1. true  

  2. true  

  3. [com.ubs.sae.test.HashTest@1]  

以上就是Java中hashCode的作用是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java中hashCode的作用是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中hashCode的作用是什么

本篇文章给大家分享的是有关Java中hashCode的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供
2023-06-03

Java中 hashcode方法的作用是什么

这期内容当中小编将会给大家带来有关Java中 hashcode方法的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Android
2023-06-14

hashCode在Java项目中的作用有哪些

本篇文章为大家展示了hashCode在Java项目中的作用有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。详解Java中hashCode的作用以下是关于HashCode的官方文档定义:hashc
2023-05-31

Java中hashCode()与equals()有什么不同

这期内容当中小编将会给大家带来有关Java中hashCode()与equals()有什么不同,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。equals()方法equals是Object类提供的方法之一,众
2023-05-31

Java 中HashCode作用_动力节点Java学院整理

第1 部分 hashCode的作用  Java集合中有两类,一类是List,一类是Set他们之间的区别就在于List集合中的元素师有序的,且可以重复,而Set集合中元素是无序不可重复的。对于List好处理,但是对于Set而言我们要如何来保证
2023-05-31

Java中hashCode方法怎么用

这篇文章主要介绍“Java中hashCode方法怎么用”,在日常操作中,相信很多人在Java中hashCode方法怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中hashCode方法怎么用”的疑
2023-06-29

java中hashcode和equals有什么不同

在Java中,hashCode()方法和equals()方法是用于比较对象的两种不同方式。hashCode()方法是Object类中的一个方法,在所有的Java对象中都有。它返回一个int类型的哈希码值,用于表示对象的唯一性。hashCod
2023-10-19

Java中random.nextint的作用是什么

Java中的random.nextInt()方法的作用是生成一个随机的int类型的整数。这个方法可以接受一个参数,表示生成随机数的范围。如果不传入参数,则生成一个随机的int类型整数,范围为整个int类型的取值范围,即-2147483648
2023-08-22

java中getRealPath的作用是什么

在Java中,getRealPath()方法用于获取Web应用程序中文件的真实路径。它返回一个字符串,表示指定路径在服务器上的实际文件系统路径。通常,Web应用程序在部署时会被打包成一个WAR文件,并被部署到服务器上。在运行时,服务器会将W
2023-08-24

Java中random.nextint()的作用是什么

Java中的random.nextInt()方法用于生成随机的整数。它可以接受一个整数作为参数,表示生成的随机数的范围,返回的值是一个介于0和指定参数之间(不包括参数本身)的随机整数。如果不提供参数,则生成的随机整数的范围是整个int类型的
2023-08-31

Java中GOF23的作用是什么

Java中GOF23的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、什么是设计模式设计模式(Design pattern) 是解决软件开发某些特定问题而提出的一些
2023-06-20

Java中CompletableFuture的作用是什么

这篇文章给大家介绍Java中CompletableFuture的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。创建CompletableFuture对象。以下四个静态方法用来为一段异步执行的代码创建Compl
2023-06-17

java中@SuppressWarnings的作用是什么

java中@SuppressWarnings的作用是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以
2023-06-14

java中@Inherited的作用是什么

java中@Inherited的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代
2023-06-14

java中SPI的作用是什么

这篇文章将为大家详细讲解有关java中SPI的作用是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类
2023-06-14

java中this的作用是什么

这期内容当中小编将会给大家带来有关java中this的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了
2023-06-14

Java中System.currentTimeMillis()的作用是什么

在Java中,`System.currentTimeMillis()`方法用于获取当前系统时间的毫秒数。它返回自1970年1月1日00:00:00 GMT以来经过的毫秒数。主要用途有以下几个方面:1. 计时和性能分析:可以使用`System
2023-09-12

java中Thread.join()的作用是什么

在Java中,Thread.join()的作用是使当前线程等待被调用join()方法的线程执行完毕。换句话说,调用join()方法的线程将会阻塞当前线程,直到被调用join()方法的线程执行完毕。具体来说,当调用线程A的join()方法来等
2023-09-26

Java中model.addattribute()的作用是什么

在Java中,model.addAttribute()方法用于向视图层传递数据。它将一个属性添加到模型中,以便在视图中使用。这个方法通常用于将控制器层中处理的数据传递给视图层进行展示。例如,一个控制器方法可能会通过model.addAttr
2023-09-27

Java中preparecall的作用是什么

Java中的prepareCall方法用于创建一个可调用的SQL存储过程或函数的PreparedStatement对象。它允许开发人员在调用存储过程或函数之前设置必要的参数,并执行该存储过程或函数。具体来说,prepareCall方法的作
Java中preparecall的作用是什么
2023-10-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录