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

news/2024/7/8 1:32:00

点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

问:如何决定使用 HashMap 还是 TreeMap?

介绍

TreeMap<K,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。

HashMap<K,V>的Key值实现散列hashCode(),分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。

结论

如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。

拓展

1、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相同的比较器排序

2、HashMap 和 TreeMap 都是非线程安全

HashMap继承AbstractMap抽象类,TreeMap继承自SortedMap接口。

AbstractMap抽象类: 覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。

SortedMap接口: 它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一个实现。

3、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);}}}
热门内容:为什么阿里规定需要在事务注解@Transactional中指定rollbackFor?
一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)半吊子架构师,一来就想干掉RabbitMQ ...
前、后端分离权限控制设计和实现思路最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

http://lihuaxi.xjx100.cn/news/272463.html

相关文章

部署教程 | ResNet原理+PyTorch复现+ONNX+TensorRT int8量化部署

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达1简介这是【集智书童】第一次录制视频的PPT课件&#xff0c;这里公开给大家&#xff0c;希望能够帮助大家在深度学习模型部署的道路上越走越远&#xff0c;让我们设计和训…

python基础(四)集合

【集合特点】   1、天生去重、循环 2 关系测试 -交集&#xff0c;差集&#xff0c;并集&#xff0c;(反向差集&#xff0c;对称差集) list [1,2,3,4,5,3,6]list_2 [2,3,5,7,8]listset(list) #去重&#xff0c;转集合list_2 set(list_2)print(list.intersection(list_2))…

学python有什么好处 学完可以做什么

近几年来&#xff0c;python在国内越来越火&#xff0c;越来越多的人开始学习python&#xff0c;学完python以后不仅仅是有了更多的就业机会&#xff0c;而且薪资也会越来越高。 学python可以做什么 学python可以做web开发&#xff0c;目前开发在国内的发展的非常好&#xf…

安卓手机测评_鲁大师又在找事?一季度安卓系统流畅度排名出炉,小米MIUI吊车尾...

随着2020年的第一个季度过去&#xff0c;各行各业都迎来了一段总结&#xff0c;手机行业也不例外。近日&#xff0c;国内知名手机评测软件鲁大师就公布了2020年第一季度安卓系统的流畅度排行榜&#xff0c;选取前十进行公示。根据这份榜单&#xff0c;可以很明显地看到&#xf…

老板说“把系统升级到https”,我用一个脚本实现了,而且永久免费!

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章现在很多站长都会考虑将自己的站点从http升级到https&#xff0c;不仅是基于安全的考虑&#xff0c;有的也是因为第三方平台的限制&#xff0c;如谷歌浏览器会将http站点标记为不安全的站点&…

工商总局:将对网店卖家身份进行全面普查

今日起《网络商品交易及有关服务行为管理暂行办法》实施。办法对网络商品经营者和网络服务经营者在境内从事网络商品交易及有关服务行为进行了规范。根据办法规定&#xff0c;通过网络从事商品交易及有关服务行为的自然人,需向提供网络交易平台服务的经营者提出申请,提交姓名和…

从样本处理到决策模型,如何用NLP识别盗版资源?

作者 | 阿里文娱高级开发工程师千起出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景随着5G时代来临&#xff0c;新媒体行业快速发展&#xff0c;盗版传播平台多样化、形式多样化&#xff0c;版权方难以通过有限的人力实现最大限度的维权。根据MUSO报告显示2017年…

Topcoder SRM 657DIV2

前言: 像我这样一直在DIV2的弱菜。。不知道说什么了。 A:一定判断有8个‘R’&#xff0c;每行 每列只有一个 B题&#xff1a;大概是 int E,int EM,int M,int MH,int H 然后EM可以给值到E&#xff0c;M&#xff0c;MH可以给值到H&#xff0c;M&#xff1b; 我的做法二分&#x…