`
lliu26
  • 浏览: 24608 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中HashMap,TreeMap,Hashtable和LinkedHashMap的比较 --- 总结

阅读更多
HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。如果插入两个键值一样的记录,那么后插入的记录会覆盖先插入的记录 


HashMap: 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。
(首先 HashMap里面实现一个静态内部类 Entry 其重要的属性有 key , value, next,从属性 key,value我们就能很明显的看出来 Entry就是HashMap 键值对实现的一个基础 bean,我们上面说到HashMap的基 础就是一个线性数组,这个数组就是 Entry[],Map 里面的内容都保存在 Entry[]里面。

Entry对象中有一个next属性,指向下一个对象。意思是说,如果出现冲突,那么java中实现hashmap的时候是用链表的方式来解决冲突的。)

TreeMap: 能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。
(注意,此实现不是同步的。如果多个线程同时访问一个映射,并且其中至少一个线程从结构上修改了该映射,则其必须 外部同步。(结构上的修改是指添加或删除一个或多个映射关系的操作;仅改变与现有键关联的值不是结构上的修改。)这一般是通过对自然封装该映射的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSortedMap方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的不同步访问,如下所示:
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));

treemap是基于红黑树实现的。
红黑树是满足一定条件的二叉树。
其实并不是多么高深的数据结构。只要记得,红黑树和平衡二叉树,都是具有特殊性质的二叉树就可以了。

在平衡二叉树中,插入了新节点,需要调整树以保证满足平衡条件【左右子树高度差不超过1】,那么红黑树在插入新节点之后,也需要调整以满足红黑树的一下条件:

1、每个节点不是红色就是黑色。
2、根节点为黑色。
3、红节点的子节点必须是黑色。
4、任一节点至NULL(树尾端)的每一条路径上,所含黑节点的数目必须相同。

红黑树并不要求左右子树高度差控制在1以内,它的平衡条件比AVL树弱。然而红黑树通常能够导致良好的平衡状态,经验告诉我们,红黑树的平均搜索效率和AV-tree几乎相等,但是其插入节点的开销相对较低,实践中发生旋转的次数相对较少。)

HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。

从开销上来说,hashMap开销较小,而TreeMap由于需要排序,开销较大!

集合框架”提供两种常规的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。使用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。  这个TreeMap没有调优选项,因为该树总处于平衡状态。

Hashtable: 与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。

LinkedHashMap: 保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。



转自  http://tangsong1005.blog.163.com/blog/static/1689660942011070357550/
         http://blog.csdn.net/lzb821/article/details/1446359
         http://blog.csdn.net/imzoer/article/details/8609816
         http://blog.csdn.net/imzoer/article/details/8109903
         http://blog.csdn.net/imzoer/article/details/8609816
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics