网站的站内结构锚文本是如何做的,企业简介内容,网站优化推广培训,网站 防攻击通过各类教科书#xff0c;我们可以总结HashMap和LinkedHashMap的区别#xff1a;
LinkedHashMap可保持顺序#xff0c;HashMap无法保持顺序数据量大、loadFactor比较小的时候#xff0c;遍历HashMap比LinkedHashMap效率低、耗时查找定位无差别#xff0c;速度飞快#…通过各类教科书我们可以总结HashMap和LinkedHashMap的区别
LinkedHashMap可保持顺序HashMap无法保持顺序数据量大、loadFactor比较小的时候遍历HashMap比LinkedHashMap效率低、耗时查找定位无差别速度飞快hash值无冲突的情况下一步到位
实际对大多数应用场景来说我们只要记住第一个区别就可以了。如果某一场景要求按照存储时的顺序获取数据那我们一定要记得不能用HashMap必须用LinkedHashMap。
本着二杆子程序员精神我们假设你一定想知道所以然。
所以我们还是从两者底层数据结构开始分析。
再次分析两者底层数据结构
现在假设我们把如下数据按顺序分别放入到HashMap和LinkeHashMap中
hm.put(Li si,45); /**节点1**/
hm.put(Zhang san,20);/**节点2**/
hm.put(Zhao liu,70);/**节点3**/
hm.put(Wang wu,30);/**节点4**/我们希望用下图来解释HashMap和LinkeHashMap在保存上述数据时的数据结构。当然我们只是为了说明问题hash桶是随意分配的实际分配的hash桶一定不是这样的。
我们假设存入节点1时HashMap得到的hash桶是table[3],所以节点1放置在该桶中。
节点2获得的hash桶是table[1],并假设节点3与节点2的hash值冲突也放入到table[1]中。节点4放置在table[15]中。
由前两节的分析我们知道存放数据到LinkedHashMap中与存放数据到HashMap中的算法基本相同因此其存放到table数组中的位置、也就是获取到的hash桶是相同的。
不同的是LinkedHashMap存放在table数组中的对象是双向链表结构通过before和after指针记录了上一节点和下一节点上图简单明了的反应了该结构。
需要注意的是LinkedHashMap用双向链表结构记录所有的节点与是否发生hash冲突无关。
HashMap和LinkHashMap对发生hash冲突后的处理方式是一致的数据会放置在同一个桶中、采用单项链表next指向下一节点结构进行记录。
你当然可以这么理解HashMap包括LinkedHashMap的table数组中只保留没有发生hash冲突的数据发生hash冲突后的数据并没有保存在table数组中只是通过table数组中的对象可以找到所有的其他冲突对象。
HashMap为啥不能保持顺序
通过上述分析答案已经显而易见了我们再啰嗦一下。
第一点是由于HashMap存储数据的时候是通过数据key值的hash值确定其在table数组中的存储位置而不是顺序存放在table数组中的所以存储是没有顺序的。
如果你现在脑海中非要冒出来这样一个问题那为啥不顺序存放、而非要去哈什么希
那我只能弱弱的回答一下HashMap具有快速获取数据的特性…
第二点是HashMap键值遍历算法是依次遍历table数组并跳过空桶。
结合以上第一、第二点以及结构图HashMap不能保持顺序应该是显而易见了。
LinkedHashMap为啥能保持顺序
第一点LinkedHashMap通过table数组与双向链表的方式保存数据链表结构保持了存储顺序。 第二点LinkedHashMap遍历key值得算法是从head开始遍历链表直到tail。所以我们也可以看到LinkedHashMap不需要遍历空桶是实打实的遍历效率更高。
结合第一点、第二点以及结构图LinkeHashMap遍历key值时能保持顺序也是显而易见的了。
顺便说一句LinkedHashMap这种table数组加双向列表的结构能够达到快速顺序遍历使用双向链表、快速定位通过table数组、hash算法。
真的是太NB了。
就到这儿了再深入研究一段时间后关于HashMap你就可以吊打面试官了。