首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当HashMap的键遇见自定义类型时

1 概述 这是Java中经典的问题,在面试中也经常被问起.很多书提到要重载hashCode()和equals()两个方法才能实现自定义键在HashMap中的查找,但是为什么要这样以及如果不这样做会产生什么后果...,好像很少有文章讲到,所以来这一篇记录下. 2 案例分析 首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么呢?...而在Object类中Hash Code默认是使用对象的地址计算的,那两个Person(“003”)的对象地址是不同的,所以它们的Hash Code也不同,自然HashMap也不会把它们当成是同一个key...重载hashCode()是为了对同一个key,能得到相同的Hash Code,这样HashMap就可以定位到我们指定的key上....重载equals()是为了向HashMap表明当前对象和key上所保存的对象是相等的,这样我们才真正地获得了这个key所对应的这个键值对.

40530
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用HashMap的时候小心点

    Map家族介绍 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有Map中确实属于比较高的。因为它可以满足我们大多数的场景了。...所以在需要线程安全的业务场景下,推荐使用ConcurrentHashMap,而HashTable不建议在新的代码中使用,如果需要线程安全,则使用ConcurrentHashMap,否则使用HashMap...HashMap的实现使用了一个数组,每个数组项里面有一个链表的方式来实现,因为HashMap使用key的hashCode来寻找存储位置,不同的key可能具有相同的hashCode,这时候就出现哈希冲突了...字段用来定位桶的索引位置,key和value就是我们的数据内容,需要注意的是,我们的key是final的,也就是不允许更改,这也好理解,因为HashMap使用key的hashCode来寻找桶的索引位置,...因为HashMap的length总是2的n次幂,所以可以使用下面的方法来做模运算: h & (length-1) h是key的hashCode值,计算好hashCode之后,使用上面的方法来对桶的数量取模

    35130

    由HashMap哈希算法引出的求余%和与运算&转换问题

    1、引出问题   在前面讲解 HashMap  的源码实现时,有如下几点:   ①、初始容量为 1<<4,也就是24 = 16   ②、负载因子是0.75,当存入HashMap的元素占比超过整个容量的75%...但是其实很多哈希算法,为了使元素分布均匀,都是用的取模运算,用一个值去模上总长度,即 n%hash。我们知道在计算机中 & 的效率比 % 高很多,那么如何将 % 转换为 & 运算呢?...3-2公式   不成立:a÷(b+c)≠a÷c+b÷c   通过 3-1公式以及 3-2 公式,我们可以得出当任意一个十进制除以一个2k的数时,我们可以将这个十进制转换成3-1公式的表示形式:   如果我们想求上面公式的余数...再回到上面说的二进制的移位操作,向右移 n 位,表示除以 2n 次方,由此我们得到一个很重要的结论: 一个十进制数对一个2n 的数取余,我们可以将这个十进制转换为二进制数,将这个二进制数右移n位,移掉的这...4、总结   通过上面的分析过程了,我们完美了证明了公式的正确性。在回到 HashMap 的实现过程,我们知道HashMap的初始容量为啥是 1<<4 了吧,而且每次扩容都是扩大一倍。

    1.6K30

    【Kotlin】类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )

    文章目录 一、使用 is 运算符进行类型检测 二、使用 as 运算符进行类型转换 ( 智能类型转换 ) 三、Any 超类 一、使用 is 运算符进行类型检测 ---- 在 Kotlin 中 , 如果不确定一个...实例对象的类型 , 可以 使用 is 运算符进行判定 , 使用方法 实例对象 is 判定类型 上述用法可以判定 实例对象 是否是 判定类型 , 如果是 返回 true , 反之 返回 false ;...as 运算符进行类型转换 ( 智能类型转换 ) ---- 将 子类对象 声明为 父类类型 , 如果要 调用 子类 特有的方法 , 必须 使用 as 运算符进行 类型转换 ; 智能类型转换 : 使用 as...智能类型转换 ; (student as Student).helloStudent() student.helloStudent() 代码示例 : open class Person..., hashCode , toString 等函数在编译器中都已经实现 , 在不同平台的编译器中实现不同 ; Kotlin 的跨平台能力比 Java 更强 , 为了支持跨平台 , Kotlin 在不同的平台中有不同的实现

    1.4K20

    不要在并发场景下使用hashmap的原因

    相信很多人都知道jdk7及其以前版本的hashmap在并发场景下使用时存在死循环(注意是死循环,不是死锁)的问题,问题出在扩容时对链表逆序的问题,下面是出问题的相关源码: /** *...,但是仍然不是安全的,存在数据丢失以及异常的问题,数据丢失比如在插入时,多个线程同时在一个节点上增加新的节点,多个线程都会将自己新增的节点与某个节点A绑定关系,这样就会导致其他线程与节点A的关联关系丢失...异常发生在TreeNode与Node节点强行转换的地方,比如TreeNode类的moveRootToFront方法,测试代码可以参考下面: /** * JDK8的hashmap虽然没有...= new HashMap(); Thread[] ts = new Thread[50]; for(int i=0;i使用ConcurrentHashMap

    23410

    Mac电脑使用:Mac电脑一键智能清理神器CleanMyMac X

    在Mac电脑使用中,如果电脑配置不是太高的情况下,外加上电脑上面安装的软件和存储的资料越来越多的时候,电脑就会提示磁盘存储空间不够,如下所示: ?...虽然有些时候使用者会手动去清理一些常规的不使用的软件或者文件,但是还是远远不够,而且有很大一部分的缓存文件和垃圾文件通过常规方法是清理不了的,而且通过手动删除清理也不彻底,治标不治本。...Mac电脑的优化,使用者可以根据自己的实际情况随心所欲的自定义使用。...,而且使用起来非常的方便,只用点击主菜单里面“扫描”按钮,然后等待扫描结束之后,根据实际情况进行选择性的自定义清理。...,而且清理Xcode的缓存不影响Xcode的正常使用。

    74920

    用数据万象转换图片格式!超全的格式一键转换

    数据万象现已支持 PSD、RAW 等高级格式图片的格式转换功能,可以将它们转为 JPG/PNG 等普通格式,满足您对高级格式图片预览的需求。...使用方式 下面将为您介绍如何通过数据万象图片处理的格式转换功能来预览高级格式的图片。这一功能支持上传时处理和云上数据处理,详情可以参考图片处理机制介绍,以上传时处理为例,使用流程如下图所示。...搭配其他处理参数使用(可选) 在格式转换的同时,也可根据实际需要搭配其他处理参数使用,例如在需要给图片添加水印的场景中,可以在 rule 规则中额外加上水印处理参数: "rule":"imageMogr2...预览图片 推荐使用自定义源站域名进行图片预览,如何开启自定义源站域名可以查看文档:开启自定义源站域名 配置完后就可以预览图片了!...效果展示 有了数据万象,预览高级格式的图片不再是难题! 体验入口 数据万象体验馆已上线格式转换功能,大家可亲自体验该功能,快速高效地转换各种图片格式,快来开始您的转换之旅吧!

    30510

    【人工智能】Python实现文本转换为语音:使用gTTS库实现

    一、引言 文本转换为语音(Text-to-Speech,简称TTS)技术是人工智能的重要组成部分,广泛应用于智能助手、导航系统、读屏软件和智能家居等领域。...然后通过pip安装gTTS库: pip install gtts 或者是 pip3 install gtts 三、使用gTTS实现文本转换为语音 以下是一个使用gTTS库将文本转换为语音并保存为MP3文件的完整示例代码...: 使用gTTS库将文本转换为语音。...客户服务:TTS技术在自动客服系统中应用广泛,通过语音交互提高客户服务的效率和体验。 五、总结 通过使用Python的gTTS库,我们可以轻松地将文本转换为语音,并保存为音频文件。...TTS技术作为人工智能的重要组成部分,不仅提升了用户体验,还在无障碍设计和智能交互中发挥了重要作用。未来,随着技术的不断进步,TTS技术将在更多领域展现其潜力和应用价值。

    22410

    python进制转换函数-Python中进制转换函数的使用

    Python中进制转换函数的使用 关于Python中几个进制转换的函数使用方法,做一个简单的使用方法的介绍,我们常用的进制转换函数常用的就是int()(其他进制转换到十进制)、bin()(十进制转换到二进制...下面我们逐个说下每个函数的用法。 bin bin()函数,是将十进制的数字转换成二进制的数字。其中bin()函数中传入的是十进制的数字,数据类型为数字类型。...v = 18num=bin(v)print(num)””””0b10010″””” oct oct()函数,是将十进制的数字转换成八进制的数字。...v = 30num=oct(v)print(num)””””0o36″””” int int()函数,是将其他进制的数字转换成十进制的数字。...其中int()函数中转入的第一个参数是需要转换的其他进制的字符串形式的数字,第二个参数是第一参数的进制数,也就是说第一个参数传的是多少进制的数字第二个参数就传个多少,数据类型为数字类型。

    1.2K20

    Uber的一键式聊天智能回复系统

    通过机器学习和自然语言理解结束,Uber实现了一套智能的聊天系统,从而有效的提升司机和乘客之间的沟通效率,减少对司机的打扰。...所以我们开始思考,如果有可能的话,司机可以通过一个简单的点击就可以与乘客进行沟通。 我们提出了一种新的智能回复功能,称为一键式聊天(OCC)。...OCC 是UberChat最新的关键的增强功能之一,旨在通过提供最相关的回复,为优步的司机伙伴提供一键式聊天体验。 图1:通过一键式聊天,司机可以更轻松地回复乘客的消息。...一键式聊天架构 一键式聊天(OCC)利用Uber的机器学习平台Michelangelo在乘客聊天消息上执行NLP,并生成适当的回复。如下面的图2所示,该体系结构遵循五个步骤: 1....推送远程和本地的表层消息给Receiver 6. 收到消息后,从Messaging Platform获取消息正文 为了支持智能回复,我们要能够使用机器学习模型以足够低的延迟实时评估回复。

    95530

    【简单了解系列】从基础的使用来深挖HashMap

    HashMap定义 说的专业一点,HashMap是常用的用于存储key-value键值对数据的一个集合,底层是基于对Map的接口实现。...你找的过程就是HashMap根据key取到对应value的过程 HashMap底层结构 table数组 首先我们要知道,我们存在HashMap中的数据最终是存了什么地方,就是如下的结构。...例如一个矩形,在本地使用的时候,有长、宽和面积三个属性,但是你要把这个对象给第三方用,但是由于面积可以通过另外两个属性推导出来,这个key就不需要传递给第三方了。...HashMap的使用 上面简单了解了HashMap的定义和基本的底层数据结构,接下来通过HashMap在平常开发中的使用来具体看看怎么实现的。...而总结我们日常的HashMap使用,大多数情况下插入和修改应该是比查找更频繁一些的。而在这种情况下,红黑树的综合表现会更好一些。

    43020

    类之间的类型转换 explicit 使用

    使用一个不同的类初始化另外一个类,这种情况是要经过类型转换才能完成的,否则语法上就无法通过。同样,类的类型转化也分隐式转换和显式转换。以下代码介绍了隐式转换和显式转换的两种方法。...以及 explicit 关键字的使用。...y; }; class Point3D { public: Point3D(int x, int y, int z) :_x(x), _y(y), _z(z) {} // 通过构造器将一个非构造器类型的对象转化为构造器类型对象...// 没加 explicit 关键字时,类似于C语言中的隐式转化 // Point3D p3a = p2; // cout << p3a; // 加了 explicit 关键字后,显式转换 Point3D...p3a = static_cast(p2); // 先走类型转换构造器,然后再走+运算符重载 Point3D p4a = p3 + static_cast(p2); cout << p4a << endl

    13330
    领券