基本介绍

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相关推荐

  1. 对比Hashtable、HashMap、TreeMap有什么不同(转)

    了解 Hashtable.HashMap.TreeMap 都是最常见的一些 Map 实现,是以键值对的形式存储和操作数据的容器类型. Hashtable 是早期 Java 类库提供的一个哈希表实现,本 ...

  2. HashMap 与 TreeMap

    集合中Map 一.说明HashMap.LinkedHashMap.Hashtable.TreeMap区别 Map : 使用键值对(key-value)存储,类似于数学上的函数 y=f(x)," ...

  3. [Map]-1-Hashtable、HashMap、TreeMap有什么不同

    Map 是广义 Java 集合框架中的另外一部分,HashMap 作为框架中使用频率最高的类型之一,它本身以及相关类型自然也是面试考察的热点. 今天我要问你的问题是,对比 Hashtable.Hash ...

  4. 【转】HashMap、TreeMap、Hashtable、HashSet和ConcurrentHashMap区别

    转自:http://blog.csdn.net/paincupid/article/details/47746341 一.HashMap和TreeMap区别 1.HashMap是基于散列表实现的,时间 ...

  5. 面试:如何决定使用 HashMap 还是 TreeMap?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 问:如何决定使用 HashMap 还是 TreeMap? 介绍 T ...

  6. java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...

  7. HashMap、TreeMap、Hashable和LinkedHashMap

    Map是最重要的数据结构之一.开始会告诉怎么用HashMap.TreeMap.Hashtable和LinkedHashMap 1.Map概述 在Java SE中有4种Map的实现:HashMap.Tr ...

  8. 1.5 Map集合:HashMap 和TreeMap 类

    Map集合,HashMap,TreeMap Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象.用于保存具有映射关系的数据 ...

  9. 深入理解HashMap和TreeMap的区别

    文章目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非 ...

最新文章

  1. pandas将列表list插入到dataframe的单元格中、pandas使用read_csv函数读取文件并设置保留数值的前置0( leading zeroes)
  2. 关于SQL Server中索引使用及维护简介
  3. POJ 3694 (tarjan缩点+LCA+并查集)
  4. linux iptables 详解
  5. 做人应该知道的十个道理
  6. python多进程线程学习_python进程、线程的学习心得
  7. E20180404-ts
  8. python连续写入数据之间用什么隔开_elasticsearch之使用Python批量写入数据
  9. selenium调用浏览器进行抓取页面
  10. suse 内核编译安装_Linux内核编译与安装
  11. Android 项目必备(二十)-->NFC 的基本使用
  12. html从谷歌浏览器跳转到IE,谷歌浏览器chrome
  13. 力扣(Leetcode)633 平方数之和
  14. 关服了的手游怎么进去_关服手游改成单机教程
  15. 世纪光棍节、神棍节快乐!
  16. Magica Cloth服装模拟插件分享
  17. Altium Designer,设置一个器件或一个区域不做电气规则检查
  18. CentOS7“ 趣味”命令 牛说:火车在天上飞 ,我吹的。
  19. 环境变量setenv函数和export命令的解释
  20. oracle归档日志存储路径,oracle 归档日志路径三个参数DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n的关系...

热门文章

  1. swift项目实战FoodPin目录
  2. 异步加载js文件的方法总结
  3. IOS开发笔记 - 基于SDWebImage的网络图片加载处理
  4. [职业生涯]你和你的工作
  5. 1.5 Hello, world! 解剖 -JSF实战 -hxzon -jsf学习笔记
  6. 发表的原创文章还希望大家多提宝贵意见!
  7. Android ViewFlipper滑动屏幕切换
  8. Basic脚本解释器移植到STM32
  9. 分布式经典书籍--深入分布式缓存 从原理到实践
  10. ❤️详解腾讯面试❤️