HashMap和有序LinkedHashMap实现对比
LinkedHashMap:LinkedHashMap简单来说是一个有序的HashMap,其是HashMap的子类,HashMap是无序的。接下来我们通过对比分析HashMap和LinkedHashMap来了解一下LinkedHashMap是如何实现有序的。首先HashMap及子类LinkedHashMap都提供了一个数组。
Node<K,V>[] table
不同key的hash值是分布在这个数组中的,key值不同,经过hash计算的hash值相同的话节点会作为相同hash值节点的next节点
class Node<K,V> implements Map.Entry<K,V> {final int hash;final K key;V value;Node<K,V> next;
}
LinkedHashMap提供的节点添加了两个属性before和after节点,用来生成双向循环列表的,这样每次在Map中添加值都会追加到链表的最后一位,这样就按照插入顺序生成了一个链表
class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before, after;Entry(int hash, K key, V value, Node<K,V> next) {super(hash, key, value, next);}
}
在LinkedHashMap中添加了链表的head和tail节点
transient LinkedHashMap.Entry<K,V> head;
transient LinkedHashMap.Entry<K,V> tail;
总结:LinkedHashMap实现有序key值的关键就是根据插入顺序另外维护了一个按照插入顺序作为标记的双向循环列表,这样在获取所有数据进行循环获取时获取到的数据就是有序的数据。
LinkedHashMap从迭代器获取到的数据就是有序的
LinkedHashIterator() {next = head;expectedModCount = modCount;current = null;}public final boolean hasNext() {return next != null;}final LinkedHashMap.Entry<K,V> nextNode() {LinkedHashMap.Entry<K,V> e = next;if (modCount != expectedModCount)throw new ConcurrentModificationException();if (e == null)throw new NoSuchElementException();current = e;//获取双向链表的下一个数据next = e.after;return e;}
HashMap从迭代器中获取到的数据就是hash值的相对排序的数据
HashIterator() {expectedModCount = modCount;Node<K,V>[] t = table;current = next = null;index = 0;if (t != null && size > 0) { // advance to first entrydo {} while (index < t.length && (next = t[index++]) == null);}}public final boolean hasNext() {return next != null;}final Node<K,V> nextNode() {Node<K,V>[] t;Node<K,V> e = next;if (modCount != expectedModCount)throw new ConcurrentModificationException();if (e == null)throw new NoSuchElementException();//从不断的从table中获取数据,tableif ((next = (current = e).next) == null && (t = table) != null) {do {} while (index < t.length && (next = t[index++]) == null);}return e;}
总结:从上面两段HashMap和LinkedHashMap迭代器实现就可以看出LinkedHashMap的实现原理了,简单来说就是访问队列。
HashMap和有序LinkedHashMap实现对比相关推荐
- hashMap 底层原理+LinkedHashMap 底层原理+常见面试题
1.源码 java1.7 hashMap 底层实现是数组+链表 java1.8 对上面进行优化 数组+链表+红黑树 2.hashmap 是怎么保存数据的. 在hashmap 中有这样一个结构 Node ...
- Map集合、 HashMap集合、LinkedHashMap集合、Hashtable集合
Map集合 Map集合的特点 Map集合是一个双链表结构的集合,一个元素包含两个值(key,value) Map集合中的元素,key和value的数据类型可以相同也可以不同 Map集合中的元素,key ...
- HashMap、创建并遍历HashMap集合、LinkedHashMap
HashMap 创建并遍历HashMap集合 案例1: 键String类型,值String类型 案例2: 键Integer类型,值String类型 案例3:键String类型,值Student类型 案 ...
- hashmap是有序的吗_这里有675道Java面试题,你准备好接招了吗?(完整版)
上周发布了418道Java面试题之后, 有粉丝留言:希望可以尽快更新题集. 这次,675道面试题,全部送给你! 还有粉丝留言:不知道怎么获取答案? 分享本文至朋友圈,集赞3个及以上,截图发送公众号对话 ...
- HashMap和Hashtable理解与对比
一.概述 HashMap和Hashtable的区别在面试的时候经常会被问到,那么它们有什么区别呢?这里谈一下它们各自的特点以及它们的区别在哪里. 二.HashMap 1.HashMap是键值对key- ...
- hashmap是有序还是无序_说实话,你要是看完这篇 HashMap ,和面试官扯皮真的就没问题了!
文章来源:看完这篇 HashMap ,和面试官扯皮就没问题了 原文作者:cxuan 来源平台:微信公众号 (如果你没有时间细抠本文,可以直接看 HashMap 概述,能让你对 HashMap 有个大致 ...
- spark sql优化:小表大表关联优化 union替换or broadcast join
----原语句(运行18min) SELECTbb.ipFROM(SELECTip ,sum(click) click_num,round(sum(click) / sum(imp), 4) user ...
- hashmap中的key是有序的么_HashMap?面试?我是谁?我在哪
(给ImportNew加星标,提高Java技能) 转自:卓庆森 https://www.cnblogs.com/zhuoqingsen/p/8577646.html 现在是晚上11点了,学校屠猪馆的自 ...
- JAVA day20、21 双列集合Map<K,V>:HashMap,LinkedHashMap,TreeMap,Hashtable, ConcurrentHashMap;JDK1.9新特性
一.Map<K,V> Java提供了专⻔的集合类⽤来存放这种这种⼀⼀对应的关系,叫做映射对象,即 java.util.Map 接⼝. 类型参数: K - 此映射所维护的键的类型 V - 映 ...
最新文章
- Lazy Load, 延迟加载图片的 jQuery 插件 - NeoEase
- 《雷达技术丛书》分享
- @cacheable 是否缓存成功_DNS缓存中毒攻击
- 织梦 php 传值,php获取post参数的几种方式
- linux定时执行python脚本_ubuntu定时执行python脚本实例代码
- Red Hat EnterPrise Linux 5.4下web服务器的综合使用(普通站点、虚拟主机、安全性、...
- 工业互联网为什么落地这么难?
- WiFi 空口抓包工具 --- OmniPeek
- IP地址资源的分配和管理
- python怎么输入正整数_python判断所输入的任意一个正整数是否为素数的两种方法...
- 微信支付:appid 与 openId 不配
- ensp 移动主机搜索不到AP信道_案例WiFi信道上的一个坑
- 如何获取自己的公网地址
- 计算机一级电子表格TF函数,TFG1000系列DDS函数信号发生器基本操作
- 自动清理内存linux,linux 过滤内存使用率并于计划任务结合来自动清理内存缓存...
- DataBase培训
- 瞧不起,与 “瞧不起”
- 计算机视觉就业怎么样?好找工作吗?
- css通知页面,CSS3 transition 实现通知消息轮播条
- TensorFlow错误:fatal error: tensorflow/core/framework/op.h: 没有那个文件或目录(PointCNN遇到的错误)