返回
海枫科技
置顶
该校与厚学网暂未合作,平台不保证课程的真实有效性,如有侵权等争议,请及时与厚学网联系处理
招生热线:400-800-2178

学校地址:广东省深圳市南山区桂庙路瑞峰创业中心B区4018

hashMap的内部构造

44 2017-12-14 09:31:22

学习笔记

  在java中有一个非常常用的数据处理型的类就是HashMap,关于HashMap我们知道它是Map的实现类,通常会有一些有关这个类的面试题,如:

  1.HashMap和HashTable的区别

  答:首先,他们都是Map的实现类;其次,HashMap不是线程安全,而HashTable是线程安全的,所以效率上HashMap要高于HashTable;第三,HashTable允许一个null的键,对值没有要求,而HashTable对键和值均不允许是null。

  2.HashMap的内部数据结构和扩容机制?

  答:HashMap是在Map的基础之上对key进行一个hash算法,从而直接得到key-value的存储位置进行存储,内部的存储机制其实是用数组包装后后来存储的,实质上的数据结构是数组加链表的结构。扩容机制是当内部存储的数据过多,即当HashMap元素数量大于或者等内部数组长度乘以加载因子的时候,会对HashMap进行扩容,扩容是非常影响效率的,他必须要复制原来的数组与链表的组合结构的同时来新增更多内容。所以,在已知自己需要的HashMap的长度的时候直接其容量。

  这个是一个很经典的HashMap的的相关面试题,以上的表面看是对的,应对面试官来说也是的。然而,对于这样的一个回答,我们去源码里找原因的价值会更大一些。首先,HashMap准确的说是AbstractMap的子类,而AbstractMap已经对Map完成了一些实现。首先,用现有的知识来说,我们可以理解HashMap内部是一个数组,数组是有下表和元素组成,HashMap里面的数组的下表是根据key的hashcode经过hash算法得到的下标,至于具体的算法我们可以以后再去研究,而元素则是一个类似于链表的结构。为什么要使用链表?我们知道,不同的key可能会有相同的hashcode,那么就有可能得到经过hash算法后得到相同下标,所以,为了不覆盖数组上原有的元素,我们将元素设置一个“挂钩”,即int  next,而这个next正好指向这个这个元素,如果下次存储仍有相同的情况出现则类推,那么我们可以想象一下这个场景:

  一个完整的数组上面有一堆key-value的元素。

  那么接下来,这么做的好处了?我们知道数组的大优势在于取,只要知道下标,不用遍历可以直接取到你要的值,那么在性能上会极大的优化取的性能。而在存上面,链表结构解决hashcode相同而导致的算出的下标冲突的问题。

  请联系网站,了解详细的优惠课程信息~

  优质、便捷、省心


文中图片素材来源网络,如有侵权请联系删除
来源:海枫科技
热门课程 全部课程

热门动态

申请免费试听

只要一个电话

我们为您免费回电

立即申请
刷新
图形验证
关闭
>>
拖动左边滑块完成上方拼图
机器人