首页 > 其他分享 >什么是hashCode 以及 hashCode()与equals()的联系

什么是hashCode 以及 hashCode()与equals()的联系

时间:2024-04-22 17:58:59浏览次数:24  
标签:存储 联系 对象 元素 equals hashCode 哈希 集合

1、什么是hashCode:
hashCode就是对象的散列码,是根据对象的某些信息推导出的一个整数值,默认情况下表示是对象的存储地址。通过散列码,可以提高检索的效率,主要用于在散列存储结构中快速确定对象的存储地址,如Hashtable、hashMap中。

为什么说hashcode可以提高检索效率呢?我们先看一个例子,如果想判断一个集合是否包含某个对象,最简单的做法是怎样的呢?逐一取出集合中的每个元素与要查找的对象进行比较,当发现该元素与要查找的对象进行equals()比较的结果为true时,则停止继续查找并返回true,否则,返回false。如果一个集合中有很多个元素,比如有一万个元素,并且没有包含要查找的对象时,则意味着你的程序需要从集合中取出一万个元素进行逐一比较才能得到结论,这样做的效率是非常低的。这时,可以采用哈希算法(散列算法)来提高从集合中查找元素的效率,将数据按特定算法直接分配到不同区域上。将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组(使用不同的hash函数来计算的),每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域,大大减少查询匹配元素的数量。

比如HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希吗找到相应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals()比较,这样就不用遍历集合中的所有元素就可以得到结论。

下面通过String类的hashCode()计算一组散列码:

public class HashCodeTest {
    public static void main(String[] args) {
        int hash= 0;
        String s= "ok";
        StringBuilder sb = new StringBuilder(s);
        
        System.out.println(s.hashCode() + "  " + sb.hashCode());
        
        String t = new String("ok");
        StringBuilder tb =new StringBuilder(s);
        System.out.println(t.hashCode() + "  " + tb.hashCode());
    }
}
运行结果:
3548  1829164700
3548  2018699554

https://blog.csdn.net/a745233700/article/details/83186808

标签:存储,联系,对象,元素,equals,hashCode,哈希,集合
From: https://www.cnblogs.com/shijianchuzhenzhi/p/18151104

相关文章

  • vbs提示没有在该机执行windows脚本宿主的权限。请与系统管理员联系
    <p>最近在项目中使用VBS来实现图片的批量删除和批量导入功能,但不知道为什么,只要在我机器上一运行VBS文件就提示“没有在该机执行windows脚本宿主的权限。请与系统管理员联系。”的错误。下面贴出本人的解决方法,并附上图片批量导入及批量删除的VBS代码。</......
  • HarmonyOS-基础之联系人案例
    使用前面学习的相关组件和api实现联系人的CRUD;效果如下父组件import{Contacts}from'../domain/Model'importContactsItemfrom'../components/ContactsItem'@Entry@ComponentstructContactsExample{//联系人数组@StatecontactsArr:Contacts[]=[......
  • 【虚幻引擎】DTProjectSettings 蓝图获取基本项目配置插件使用说明 获取项目命名,项目
    本插件可以使用蓝图获取到项目的一些基本配置,如获取:公司名、公司识别名、版权声明、描述、主页、许可条款、隐私政策、项目ID、项目命名、项目版本、支持联系方式、项目显示标题、项目调试标题信息、应保留窗口宽高比、使用无边框窗口、以VR启动、允许窗口重设大小、允许关闭、允......
  • 域名之A记录,CNAME,NS联系和区别
    域名解析中常常涉及:A记录,CNAME,NS1.A记录又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。说明:指向的目标主机地址类型只能使用IP地址;2.CNAME通常称别名指向,您可以为一个主机设置别名。比如设置test.mydomain.com,用来指向一个......
  • 【软考】计算机组成与体系结构 - 系统可靠性分析与设计(串联系统与并联系统可靠度计算)
    一、并联系统1.1并联系统的结构注:少数子系统的失效将不会影响整个系统对于并联系统,可以使用以下公式来计算其可靠度:R=1-(1-R1)(1-R2)...(1-Rn)其中,R1,R2,…,Rn是各个组件的可靠度。1.2并联系统可靠性的计算通过计算失效率来求得可靠性,即各个子系统的失......
  • Java并发(二十四)----wait、notify、notifyAll、join区别与联系
    1、join是调用者轮询检查线程alive状态,执行后线程进入阻塞状态。如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。可以实现一个线程的顺序执行。t1.join();等价于下面的代码synchronized(t1){  //调用者线程进入t1......
  • 在使用set添加对象的时候,重写了hashcode方法后,为什么equals返回的仍是false,如何理解ha
    /**1.对象的哈希码值和内存地址值不是一回事;*2.如果自定义类不复写Object类中的equals方法,那么equals比较的就是两个对象的内存地址值。*//***下面证明了hash值和内存地址的关系*一、当没有重写hashCode()方法的时候,*S......
  • C++11中auto与decltype的区别与联系深入解析
    文章目录一、引言二、auto关键字及其特性1、auto的基本定义与用途2、auto在类型推导中的应用3、auto的局限性及需要注意的问题三、decltype关键字及其特性1、decltype的基本定义与用途2、decltype在类型推导中的应用3、decltype的局限性及需要注意的问题四、auto与decl......
  • Hashmap源码什么要对hashcode做一次高16位异或低16位的操作
    翻译一下就是:计算键的hashCode()方法,并将其高几位通过异或操作传播到低位。因为哈希表使用二的幂次方进行掩码操作,那些仅在当前掩码位之上不同的哈希集将会一直发生冲突。(已知的例子包括在小表中保存连续整数的Float键集。)因此,我们应用了一种变换来将高位的影响向下传播。在速度......
  • 【知识点】hashcode和equals
    哈希计算(Hashing)是一种将数据通过哈希函数(HashFunction)转换成固定长度的值(hashvalue)的过程,是一个通用的计算方式。在Java中的表现就是hashcode()方法,在Object类上,常用于HashMap、HashSet等集合中,用于快速查找、唯一约束等作用。equals()方法是从逻辑上判断两个对象是否相等,如......