黑马程序员技术交流社区

标题: Java中HashMap和TreeMap的区别 [打印本页]

作者: LXD2016    时间: 2016-10-18 23:43
标题: Java中HashMap和TreeMap的区别
首先介绍一下什么是Map。在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value。这就是我们平时说的键值对。

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

线程安全
在Java里,线程安全一般体现在两个方面:
1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized。如ArrayList和Vector,HashMap和Hashtable
(后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。

2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。
1.AbstractMap抽象类和SortedMap接口
AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。
SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。

2.两种常规Map实现
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
(1)HashMap(): 构建一个空的哈希映像
(2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
(1)TreeMap():构建一个空的映像树
(2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
(3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序

3.两种常规Map性能
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按自然顺序或自定义顺序遍历键(key)。

4.总结
HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
作者: 雪中鱼01    时间: 2016-10-18 23:56
学习了

作者: star皆空    时间: 2016-10-19 00:32
感谢分享

作者: 堂吉诃德    时间: 2016-10-19 01:08
谢谢谢谢谢谢

作者: Quasimodo2    时间: 2016-10-19 12:06
感谢分享

作者: HermitXU    时间: 2016-10-19 12:12
学习了,谢谢分享

作者: 噜噜吧    时间: 2016-10-19 14:14
楼主多分享分享学习的经验,让大家都学习学习!
作者: LXD2016    时间: 2016-10-19 18:00
噜噜吧 发表于 2016-10-19 14:14
楼主多分享分享学习的经验,让大家都学习学习!

好的,版主大大

作者: Array先生    时间: 2016-10-19 23:18
TreeMap底层是二叉树,线程是不同步的,线程不安全的效率高,可以根据键进行排序.
HashMap底层是哈希表,线程也是不同步的,线程不安全,效率高,,可以存null值和null键,保证键的唯一性是根据hashCode和equals
作者: 煤男纸    时间: 2016-10-19 23:31
可以可以

作者: 噜噜吧    时间: 2016-10-20 11:15
LXD2016 发表于 2016-10-19 18:00
好的,版主大大

加油

作者: wgc    时间: 2016-10-21 23:44
总结的不错   继续努力

作者: Quasimodo2    时间: 2016-10-23 12:26
不错,谢了

作者: IceLoveInFire丶    时间: 2016-10-23 13:10
treemap根据键的发展关系排序的吗?

作者: 渔夫的星辰    时间: 2016-10-24 20:18
厉害,很详细
作者: 困难熊    时间: 2016-10-24 20:23
涨知识了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2