linkhashmap与 区别和linkedlinkhashmap与 区别的区别

JDK容器学习之Map : HashMap,TreeMap,LinkedHashMap对比
JDK容器学习之Map : HashMap,TreeMap,LinkedHashMap对比
人类语言的关键
HashMap,TreeMap,LinkedHashMap对比对比分析HashMap,LinkedHashMap,TreeMap三种容器的存储结构,应用场景,使用注意事项等1. 存储结构HashMap 存储结构:数组 + 链表 + 红黑树LinkedHashMap 存储结构 和HashMap 相同,区别是维护一个根据插入顺序保持的双向链表TreeMap 存储结构: 红黑树2. 是否有序HashMap 无序LinkedHashMap 根据插入先后顺序确定遍历顺序TreeMap 有序,根据Key进行比较获取先后顺序3. 迭代HashMap 迭代从头开始遍历数组若数组中该索引处为null,或者Node的next指向null,则扫描数组的下一位若数组中该索引处非null,切Node的next指向另一个Node,则依次扫描Node的next元素,直到为null示意图如下:LinkedHashMap 迭代扫描内部的双向链表从head指向的Node节点出发,依次扫描 after指向的下一个Node节点,直到最后一个TreeMap 迭代因为TreeMap是红黑树,左孩子 & 根 & 右孩子,所以按照树的中序遍历方式进行扫描,即先获取树的左孩子,然后是根,最后是右孩子4. 应用场景&使用小建议1. HashMap, LinkedHashMap, TreeMap 非线程安全,因此都不适用于多线程环境下2. 希望有序的Map,考虑采用 LinkedHashMap, TreeMap有自己的排序需求场景的,可以使用TreeMap根据塞入Map的先后顺序进行排序的,可以使用 LinkedHashMap3. 其他普通kv接口存储,尽量采用HashMap若能确定Map的元素个数,在初始化时,显示指定容量大小,避免频繁的数组扩容key的hash尽量分散,避免出现大量的hash碰撞(一般不自己覆盖 key的hashcode方法,这个问题不太大)4. 有自定义排序需求时,使用TreeMap尽量保证结构的稳定,不会频繁出现添加删除的情况(因为会导致)Map中不存在两个Key通过定义的比较器,返回0,即不存在类似HashMap的碰撞情况5. 根据进入Map的先后确定遍历顺序,使用LinkedHashMap遵从HashMap的使用规则5. 相关博文收集汇总HashMap,LinkedHashMap,TreeMap相关的技术博文JDK容器学习之HashMap(一):底层存储结构分析JDK容器学习之HashMap(二):读写逻辑详解JDK容器学习之HashMap(三):迭代器实现JDK容器学习之TreeMap(一):底层结构&应用场景
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
人类语言的关键
百家号 最近更新:
简介: 喜欢数码类产品并且很了解这方面有一些见解
作者最新文章HashMap、TreeMap、Hashtable、LinkedHashMap区别
来源:open开发经验库
HashMap 
允许设置key和value为null,key存放是乱序的,不支持线程的同步,即任一时刻可以有多个线程同时写HashM可能会导致数据的
不一致。如果需要同步,可以用 
Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap,访问速度
快,因为它根据key的HashCode 值来存储数据
public static void main(String[] args) {
System.out.println("************************* HashMap *******************************");
HashMap&String, String& hashMap = new HashMap&String, String&();
hashMap.put("X-rapido", "Admin");
hashMap.put("X-rapido", "User"); // 重复的会替换旧数据
hashMap.put("Y-miya", null);
hashMap.put("J-lina", null);
System.out.println(hashMap.get(null));
hashMap.put(null, "Manager");
hashMap.put(null, "liner");
hashMap.put("刘仁奎", "好帅");
hashMap.put("PrettyBoy", "X-rapido");
System.out.println(hashMap.get(null) + " : " + hashMap.get("刘仁奎") + "\n");
for (String key : hashMap.keySet()) {
System.out.println(key + " : " + hashMap.get(key));
************************* HashMap *******************************
liner : 好帅
null : liner
J-lina : null
Y-miya : null
X-rapido : User
PrettyBoy : X-rapido
刘仁奎 : 好帅
TreeMap
不允许key为null,但允许value为null,线程非同步,存放是根据key默认是升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
public static void main(String[] args) {
System.out.println("************************* TreeMap *******************************");
TreeMap&String, String& treeMap = new TreeMap&String, String&();
treeMap.put("X-rapido", "Admin");
treeMap.put("X-rapido", "User"); // 重复的会替换旧数据
treeMap.put("Y-miya", null);
treeMap.put("J-lina", null);
System.out.println(treeMap.get(null));
treeMap.put(null, "Manager");
************************* TreeMap *******************************
Exception in thread "main" java.lang.NullPointerException
at java.util.TreeMap.getEntry(TreeMap.java:324)
at java.util.TreeMap.get(TreeMap.java:255)
at com.founder.MapSoft.main(MapSoft.java:32)
正确代码
System.out.println("************************* TreeMap *******************************");
TreeMap&String, String& treeMap = new TreeMap&String, String&();
treeMap.put("X-rapido", "Admin");
treeMap.put("X-rapido", "User"); // 重复的会替换旧数据
treeMap.put("Y-miya", null);
treeMap.put("J-lina", null);
treeMap.put("刘仁奎", "好帅");
treeMap.put("PrettyBoy", "X-rapido");
for (String key : treeMap.keySet()) {
System.out.println(key+" : "+treeMap.get(key));
************************* TreeMap *******************************
J-lina : null
PrettyBoy : X-rapido
X-rapido : User
Y-miya : null
刘仁奎 : 好帅
可以使用System.out.println(treeMap.firstEntry().getKey());和System.out.println(treeMap.firstKey());获取排完序之后的第一个key和value
Hashtable
key和value都不允许为null,线程同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢
LinkedHashMap
保存插入的顺序,线程非同步,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的
不支持线程的同步,即任一时刻可以有多个线程同时写HashM可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
AbstractMap
Dictionary
AbstractMap
HashMap
HashMap
HashTable
TreeMap
LinkedHashMap
是否有序排列
n(随机的)
y (默认升序)
y(按插入顺序排列)
线程是否同步
允许Key为null
允许Value为null
快(HashMap的遍历速度和他的容量有关)
慢(遍历速度只和实际数据有关,和容量无关)
插入、删除和定位元素,HashMap是最好的选择
线程安全
取出来的是排序后的键值对,插入、删除需要维护平衡会牺牲一些效率
需要输出的顺序和输入的顺序相同
参考文章:http://blog.csdn.net/xiaokui_wingfly/article/details/
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动LinkedHashMap - ImportNew2011年4月 Java大版内专家分月排行榜第二2010年8月 Java大版内专家分月排行榜第二2010年5月 Java大版内专家分月排行榜第二2008年2月 Java大版内专家分月排行榜第二2007年7月 Java大版内专家分月排行榜第二
2011年2月 Java大版内专家分月排行榜第三2010年9月 Java大版内专家分月排行榜第三2008年9月 Java大版内专家分月排行榜第三2008年1月 Java大版内专家分月排行榜第三2007年11月 Java大版内专家分月排行榜第三2007年9月 Java大版内专家分月排行榜第三
2011年4月 Java大版内专家分月排行榜第二2010年8月 Java大版内专家分月排行榜第二2010年5月 Java大版内专家分月排行榜第二2008年2月 Java大版内专家分月排行榜第二2007年7月 Java大版内专家分月排行榜第二
2011年2月 Java大版内专家分月排行榜第三2010年9月 Java大版内专家分月排行榜第三2008年9月 Java大版内专家分月排行榜第三2008年1月 Java大版内专家分月排行榜第三2007年11月 Java大版内专家分月排行榜第三2007年9月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 linkhashmap与 区别 的文章

 

随机推荐