培训首页  >  JAVA新闻  >  hashMap的内部构造

hashMap的内部构造

[2017-12-13 09:57:15] 浏览量:44 来源:

海枫科技

  在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相同而导致的算出的下标冲突的问题。

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

  优质、便捷、省心


文中图片素材来源网络,如有侵权请联系删除

网上报名

热门信息

温馨提示