来源:蜘蛛抓取(WebSpider)
时间:2017-10-31 04:50
标签:
linkhashmap与 区别
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大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。