A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蓝玉 中级黑马   /  2015-3-22 13:33  /  2628 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

HashMap,LinkedMap,TreeMap的区别


HashMap,LinkedHashMap,TreeMap都属于Map。

LinkedHashMap是HashMap的子类。

Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复


1.HashMap的内部结构是一个数组,线性顺序存储,二次结构使用线性的单链表。使用key的hashCode做二次hash之后,再截取小于数组长度的值为索引值。key可以为null,存在索引为0的位置上。由于使用了数组,所以有一个负载因子loadFactor的概念(临界阈值threshold)和resize。resize比较耗时,冲突时链式遍历查找也比较耗时,所以选定一个合适的初始容易比较重要。存取性能都较高。迭代遍历时一维使用数组,二维使用链表。

          HashMap            是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直              接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的            键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任             一 时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如             果需要同步,可以用 Collections的synchronizedMap方法使HashMap           具有同步的能力。

2.LinkedHashMap是HashMap的子类。内部结构是一个数组,线性顺序存储,二次结构使用线性的单链表,但同时内部维护了一个双向循环链表,可以保持顺序。access-order=false默认为使用新增存储顺序,access-order=true则指定使用读取和访问顺序。removeEldestEntry=false(当指定为true时,就是实现LRU算法的缓存容器,当然要指定淘汰时的使用频率和容量上限,其实是一个最近最少使用-->最近使用access-order=true/最新存储access-order=false)。存取性能较HashMap差-些,但相差不大。header.after为尾方向,header.before为首方向。迭代遍历时entrySet().iterator()跟HashMap一样(有点困惑,为什么不按线性顺序进行迭代,只能重写entrySet(),keySet()和values()方法)。适用于有缓存设计需求的情况(需继承)。 3.TreeMap的内部结构是一棵红黑树(又叫排序数,是二叉树的一种),使用链式存储,可以指定比较器Comparator,key需实现Comparable接口。key不能为null。存结点性能稍差,因为需要调整树结构;取结点用的是链表遍历,但是属于有序比较,性能中等。迭代遍历时用的树的中序遍历,是一个有序序列。适用于有排序需求的情况。



4 个回复

倒序浏览
楼主总结的不错
回复 使用道具 举报
总结的不错
回复 使用道具 举报
楼主好细心  大赞
回复 使用道具 举报
收了先!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马