3.从hashCode观察HashMap的用法
内容提要
• 从数据结构的散列表里观察HashMap高效索引的机制。
• 从散列表里的冲突机制观察 HashMap的数据结构。
• 不重写hashcode和equals方法会有什么后果。
• 讲述hashcode和HashMap方法该抛出哪些亮点说辞
• 引出该话题的技巧
数据结构里的散列表高速索引的机制
• 长度为n的线性表,存放无序数据,平均查找时间是n/2
• 引入hash函数(散列函数),关联数据和存储位置
• 存取数据前,先用hash函数计算hash值
• HashMap来源于数据结构里的散列表
散列表里解决冲突的方法
• 两个不同的值,有可能hash值相同,就引发冲突
• 散列表有多种解决方法,HashMap里用到了“链地址法”
链地址法就是:在冲突的索引位,用链表的形式存储冲突的数据。
在HashMap里存储不带hashcode和equals的对象会有什么后果?
• 定义一个Key类,不重写hashcode和equals方法
• 实际用到了Object类里的hashcode和equals
在HashMap里存储不带hashcode和equals的对象
• k1和k2的id都是1,用k1放,用k2取不出来
• 实际上,期望用k2取出值
不重写hashcode的后果
• k1和k2的hashcode不同,因为Object类的hashcode是返回地址
• k1存入的和k2获取的地址不同,所以返回是null
重写hashcode但不重写equals的后果
• 能用hashcode找到对应存储索引位
• 但可能会有冲突,所以需要再调用equals判断是否相等
• Key类里没重写equals方法,所以是调用Object类的,以地址值判断
此时找到的值可能是对应索引位置的冲突链上存储的冲突值的那个 不明确,所以还是得重写equals方法比较下
重写hashcode和equals
• 能用hashcode找到对应存储索引位
• 调用equals方法,判断相同,所以能取出
被问到HashMap或hashcode话题,该说明的知识点
• 结合散列函数,说明散列表快速索引的原理,并说明如何解决冲突
• 不重写hashcode和equals方法,会调用Object类的。
• 着重说明,重写equals方法是和散列表里的“冲突”有关
• 说明下如何重写:根据类的唯一主键来判断hashcode是否该一致, 两对象是否该equals
• 这样就能结合数据结构,展示扎实的集合方面技能
如何找抛出HashMap话题的机会
• 在介绍项目时说明,比如xx项目的xx模块里,我们用到了HashMap ,其中键是自定义类型,然后展开
• 介绍项目时说,在使用某ArrayList对象时,发现需要频繁查找其中 数据,成为性能瓶颈,后来就用HashMap对象来重构
• 被问到任何HashMap,hashcode相关问题时,适当展开
• 被问到集合相关问题时,找机会说出来,比如被问,你用过哪些集合 对象,可以说出HashMap相关话题
总结
1. 从数据结构角度,讲述了散列表存储数据以及处理冲突的方式 2. 讲述了HashMap里,要重写equal和hashcode方法的原因 3. 从反面给出了不重写equals和hashcode方法的后果 4. 讲述了面试中如何借HashMap展示能力的