从电商购物车到游戏排行榜,揭开 HashMap 和 TreeMap 的秘密!

开发 前端
如果性能是第一要义,比如需要频繁查询数据,而对顺序没要求,HashMap 是首选。它利用哈希表直接定位到存储位置,插入和查找效率都非常高。

大家好,我是小米,一个喜欢分享技术的 29 岁程序员。这次,我想跟大家聊聊我前不久在一次 Java 社招面试中遇到的一道题:“如何决定使用 HashMap 还是 TreeMap?”面试官一个问题丢过来,我还没开口,脑子里就开始狂飙内存了!

那天面试是在一家金融科技公司。面试官坐在对面,一脸温和地说:“小米,我们经常在实际开发中需要选择合适的数据结构。你能说说在什么情况下会选择 HashMap,什么时候会用 TreeMap 吗?”

第一步:了解背景,找到切入点

既然是面试题,咱们先从基础聊起,确保逻辑清晰、全面铺垫。

1. 什么是 HashMap?

HashMap 是 Java 中基于哈希表实现的键值对存储数据结构。它的特性是:

  • 查找/插入性能快:时间复杂度是 O(1)(哈希冲突少时)。
  • 无序存储:它不保证元素的顺序。
  • 允许一个 null 键和多个 null 值。

2. 什么是 TreeMap?

TreeMap 是基于红黑树实现的键值对存储数据结构,特性如下:

  • 键是有序的:默认按自然顺序排序,或者按 Comparator 提供的顺序排序。
  • 查找/插入性能较慢:时间复杂度为 O(log n)。
  • 不允许 null 键,但允许多个 null 值。

小米思考

我一边在脑海中快速复习知识点,一边脑补了两个典型的使用场景。为了让面试官“惊喜”,我决定边讲边结合实际案例。

第二步:从性能说开,找到“速度与顺序”的平衡点

“小米,具体举个例子吧。”面试官提示我。

“好嘞!”我先抛出两个问题,“你是想要快速查找元素呢,还是需要保证数据的有序性?”

如果性能是第一要义,比如需要频繁查询数据,而对顺序没要求,HashMap 是首选。它利用哈希表直接定位到存储位置,插入和查找效率都非常高。

案例 1:电商购物车的实现

购物车是电商系统中最常见的功能。

用户把商品加入购物车,通常以商品 ID 作为键,商品信息作为值存储。此时:

  • 查询效率至关重要,因为用户随时可能查看购物车中的商品。
  • 不关心商品的顺序,只需要快速响应即可。

用代码简单表示一下:

图片图片

“小米,那 TreeMap 就没用了吗?”面试官追问。

“当然不是!”我马上补充,“TreeMap 的最大优势在于数据有序性。”

案例 2:排行榜功能的实现

假设你要实现一个简单的在线游戏排行榜,按玩家分数从低到高排列。此时,TreeMap 是再合适不过的选择:

  • TreeMap 默认按照键的顺序存储数据,天然支持有序性。
  • 红黑树的结构使得插入和查找的效率在 O(log n) 的范围内。

以下是代码示例:

图片图片

结果输出:

图片图片

第三步:深挖需求,结合业务细节

讲完性能和顺序,我又主动提到了内存和线程安全问题。

“在实际开发中,我们还需要根据项目需求选择,比如:”

1. HashMap 是不是线程安全?HashMap 在多线程环境下可能导致数据不一致。为了线程安全,可以使用 Collections.synchronizedMap() 或 ConcurrentHashMap。

2. TreeMap 是否占用更多内存?由于 TreeMap 的底层是红黑树,它会存储额外的树节点结构,相较于 HashMap 占用稍多的内存。如果你的数据量特别大、对有序性要求较低,HashMap 会更高效。

第四步:加点料,让回答更“灵活”

“面试官,其实 HashMap 和 TreeMap 也能一起用!”我给出了第三种答案。

案例 3:分区处理大数据

如果需要快速定位分区,同时保证分区内的数据有序,可以结合 HashMap 和 TreeMap:

  • 用 HashMap 存储分区的映射关系。
  • 每个分区使用 TreeMap 维护有序的数据。

代码示例:

图片图片

总结:如何选择?

我看着面试官,最后总结了一句:“其实选择 HashMap 还是 TreeMap,关键在于性能与顺序的取舍。如果需要快速查询,选 HashMap;如果需要保证顺序,选 TreeMap。”

面试官点了点头,笑着说:“很不错!”

责任编辑:武晓燕 来源: 软件求生
相关推荐

2014-11-17 10:13:09

云智慧

2024-12-02 08:30:19

2015-08-03 11:48:12

购物车动画

2013-08-23 09:41:19

2022-12-16 08:52:14

购物车系统存储

2019-08-02 09:26:24

深度学习框架排行榜

2012-06-01 13:16:25

Linux游戏

2024-08-29 09:32:36

2019-10-15 11:11:02

游戏显卡NVIDIA

2013-05-23 10:19:01

TreeMap

2023-03-15 08:03:31

2012-04-28 14:29:36

App Store冲榜策略排行榜规则

2009-04-09 08:46:02

iphone苹果移动OS

2022-06-17 12:10:07

RPA机器人流程自动化

2014-07-30 12:56:56

2012-05-28 09:34:36

编程语言WEB编程

2013-09-27 11:32:29

编程语言

2022-06-28 14:42:26

ETS购物车应用

2012-10-08 11:18:05

JavaMVC项目

2022-09-13 16:01:13

购物车京东接口
点赞
收藏

51CTO技术栈公众号