惊呆面试官的回答:HashMap和TreeMap的区别

开发 前端
HashMap是基于哈希表+数组来实现的,而TreeMap是基于红黑树实现的。使用HashMap需要键对象明确定义了hashCode()和equals()这两个方法,而且为了优化HashMap空间的使用,可以调整初始容量大小和扩容。

​ 前几天,有一位粉丝在直播间问了我这样一个问题,说HashMap和TreeMap有什么区别。今天,我给大家分享一下我的理解。

1、两者区别

我们知道不管是HashMap还是TreeMap,都是通过对象来对对象进行索引的Map集合。我们把用来索引的对象叫做Key,而索引对应的对象叫做Value。这就是我们平时说的键值对。它们的类关系如图所示:

图片

关于HashMap和TreeMap的区别,我从以下4个方面来分析:

图片

1)数据结构方面

HashMap是基于哈希表+数组来实现的,而TreeMap是基于红黑树实现的。

使用HashMap需要键对象明确定义了hashCode()和equals()这两个方法,而且为了优化HashMap空间的使用,可以调整初始容量大小和扩容。

TreeMap没有大小设置选项,因为,红黑树结构总是处于平衡状态。

图片

2)效率方面

HashMap比TreeMap的性能更高。

HashMap的时间复杂度是O(1),它是通过哈希函数计算的哈希地址。

而TreeMap主要是保证数据平衡,时间复杂度是O(log2 n)。

图片

3)线程安全方面

HashMap和TreeMap都是非线程安全的。

如果在多线程并发情况下建议使用ConcurrentHashMap;

如果既要保证线程安全又要保证顺序,可以使用 Collections.synchronizedMap()方法转化为线程安全的集合。

图片

4)应用场景方面

HashMap是无序的,而TreeMap是有序的。

TreeMap适用于按自然顺序或自定义顺序遍历键的场景。

HashMap适用于在Map中插入、删除和定位元素。

日常开发建议多使用HashMap,只有在需要排序的时候才使用TreeMap。

2、总结

最后,我把HashMap和TreeMap的更多详细区别,都整理在这张表中了,需要的小伙伴可以在我的个人主页中获取。

基础

哈希图

树状图

Definition

HashMap是基于哈希表的Map接口实现。

TreeMap是Map接口的基于Tree结构的实现。

Interface Implements

HashMap实现Map, Cloneable和Serializable接口。

TreeMap实现NavigableMap, Cloneable和Serializable接口。

空键/值

HashMap允许单个null键和多个null值。

TreeMap不允许使用空键, 但可以具有多个空值。

同质/异质

HashMap允许异构元素, 因为它不对键执行排序。

由于排序, TreeMap允许将齐次值作为键。

Performance

HashMap比TreeMap更快, 因为它为诸如get()和put()之类的基本操作提供了O(1)的恒定时间性能。

与HashMap相比, TreeMap速度较慢, 因为它为大多数操作(如add(), remove()和contains())提供O(log(n))的性能。

数据结构

HashMap类使用哈希表。

TreeMap在内部使用Red-Black树, 这是一种自平衡二进制搜索树。

Comparison Method

它使用Object类的equals()方法比较键。Map类的equals()方法将其覆盖。

它使用compareTo()方法比较键。

Functionality

HashMap类仅包含诸如get(), put(), KeySet()等基本功能。

TreeMap类具有丰富的功能, 因为它包含如下功能:tailMap(), firstKey(), lastKey(), pollFirstEntry(), pollLastEntry()。

元素顺序

HashMap不维护任何顺序。

元素以自然顺序(升序)排序。

Uses

当我们不需要按排序顺序的键值对时, 应使用HashMap。

当我们需要按排序(升序)顺序的键值对时, 应使用TreeMap

图片

图片

好了,以上就是我对HashMap和TreeMap的理解。

责任编辑:武晓燕 来源: Tom弹架构
相关推荐

2015-08-24 09:00:36

面试面试官

2019-11-26 08:24:13

TCP拥塞控制网络协议

2021-05-12 08:20:53

开发

2021-10-22 08:37:13

消息不丢失rocketmq消息队列

2020-06-19 15:32:56

HashMap面试代码

2013-05-23 10:19:01

TreeMap

2021-03-22 17:20:48

MYSQL开发数据库

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2019-11-21 08:40:44

面试官优化性能

2020-12-03 06:30:11

内部类对象变量

2024-04-03 15:33:04

JWTSession传输信息

2023-02-17 08:10:24

2015-08-13 10:29:12

面试面试官

2021-03-24 10:25:24

优化VUE性能

2020-12-01 11:50:49

数据库Redis面试

2016-03-17 11:06:46

跳槽加薪面试

2021-08-17 07:15:16

Git RebaseGit Merge面试

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2023-01-30 15:39:40

GETHTTP

2021-08-19 08:36:22

Git ResetGit Revert版本
点赞
收藏

51CTO技术栈公众号