【面试题】使用 HashMap 还是 TreeMap
基本介绍
TreeMap<K,V>
的Key值是要求实现java.lang.Comparable
,所以迭代的时候TreeMap
默认是按照Key
值升序排序的;TreeMap
的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key
)。
HashMap<K,V>
的Key值实现散列hashCode()
,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。
结论
如果你需要得到一个有序的结果时就应该使用TreeMap
(因为HashMap
中元素的排列顺序是不固定的)。除此之外,由于HashMap
有更好的性能,所以大多不需要排序的时候我们会使用HashMap
。
拓展
HashMap 和 TreeMap 的实现
HashMap
:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()
和equals()
[可以重写hashCode()
和equals()
],为了优化HashMap
空间的使用,可以调优初始容量和负载因子。
- HashMap(): 构建一个空的哈希映像
- HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射
- HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
- HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
TreeMap
:基于红黑树实现。TreeMap
没有调优选项,因为该树总处于平衡状态。
- TreeMap():构建一个空的映像树 TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素
- TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序
- TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序
HashMap 和 TreeMap 都是非线程安全
HashMap
继承AbstractMap
抽象类,TreeMap
继承自SortedMap
接口。
AbstractMap
抽象类:覆盖了equals()
和hashCode()
方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry
接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。
SortedMap
接口:它用来保持键的有序顺序。SortedMap
接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap
和处理SortedSet
一样。添加到SortedMap
实现类的元素必须实现Comparable
接口,否则您必须给它的构造函数提供一个Comparator
接口的实现。TreeMap
类是它的唯一一个实现。
TreeMap中默认是按照升序进行排序的,如何让他降序
通过自定义的比较器来实现
定义一个比较器类,实现Comparator
接口,重写compare
方法,有两个参数,这两个参数通过调用compareTo
进行比较,而compareTo
默认规则是:
如果参数字符串等于此字符串,则返回 0 值;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
自定义比较器时,在返回时多添加了个负号,就将比较的结果以相反的形式返回,代码如下:
static class MyComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {// TODO Auto-generated method stubString param1 = (String)o1;String param2 = (String)o2;return -param1.compareTo(param2);}
}
之后,通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:
MyComparator comparator = new MyComparator();Map<String,String> map = new TreeMap<String,String>(comparator);
这样,我们就可以使用自定义的比较器实现降序了
public class MapTest {public static void main(String[] args) {//初始化自定义比较器MyComparator comparator = new MyComparator();//初始化一个map集合Map<String,String> map = new TreeMap<String,String>(comparator);//存入数据map.put("a", "a");map.put("b", "b");map.put("f", "f");map.put("d", "d");map.put("c", "c");map.put("g", "g");//遍历输出Iterator iterator = map.keySet().iterator();while(iterator.hasNext()){String key = (String)iterator.next();System.out.println(map.get(key));}}static class MyComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {// TODO Auto-generated method stubString param1 = (String)o1;String param2 = (String)o2;return -param1.compareTo(param2);}}}
【面试题】使用 HashMap 还是 TreeMap相关推荐
- 对比Hashtable、HashMap、TreeMap有什么不同(转)
了解 Hashtable.HashMap.TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型. Hashtable 是早期 Java 类库提供的一个哈希表实现,本 ...
- HashMap 与 TreeMap
集合中Map 一.说明HashMap.LinkedHashMap.Hashtable.TreeMap区别 Map : 使用键值对(key-value)存储,类似于数学上的函数 y=f(x)," ...
- [Map]-1-Hashtable、HashMap、TreeMap有什么不同
Map 是广义 Java 集合框架中的另外一部分,HashMap 作为框架中使用频率最高的类型之一,它本身以及相关类型自然也是面试考察的热点. 今天我要问你的问题是,对比 Hashtable.Hash ...
- 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别
转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...
- 面试:如何决定使用 HashMap 还是 TreeMap?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 问:如何决定使用 HashMap 还是 TreeMap? 介绍 T ...
- java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...
- HashMap、TreeMap、Hashable和LinkedHashMap
Map是最重要的数据结构之一.开始会告诉怎么用HashMap.TreeMap.Hashtable和LinkedHashMap 1.Map概述 在Java SE中有4种Map的实现:HashMap.Tr ...
- 1.5 Map集合:HashMap 和TreeMap 类
Map集合,HashMap,TreeMap Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象.用于保存具有映射关系的数据 ...
- 深入理解HashMap和TreeMap的区别
文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...
最新文章
- pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
- 关于SQL Server中索引使用及维护简介
- POJ 3694 (tarjan缩点+LCA+并查集)
- linux iptables 详解
- 做人应该知道的十个道理
- python多进程线程学习_python进程、线程的学习心得
- E20180404-ts
- python连续写入数据之间用什么隔开_elasticsearch之使用Python批量写入数据
- selenium调用浏览器进行抓取页面
- suse 内核编译安装_Linux内核编译与安装
- Android 项目必备(二十)-->NFC 的基本使用
- html从谷歌浏览器跳转到IE,谷歌浏览器chrome
- 力扣(Leetcode)633 平方数之和
- 关服了的手游怎么进去_关服手游改成单机教程
- 世纪光棍节、神棍节快乐!
- Magica Cloth服装模拟插件分享
- Altium Designer,设置一个器件或一个区域不做电气规则检查
- CentOS7“ 趣味”命令 牛说:火车在天上飞 ,我吹的。
- 环境变量setenv函数和export命令的解释
- oracle归档日志存储路径,oracle 归档日志路径三个参数DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n的关系...