怎样决定使用 HashMap 还是 TreeMap?
查看完整题解
参考回答
直接回答
只需按键增删查,且不要求键有序时,通常先考虑 HashMap;需要按键排序、找邻近键或查询一段键范围时,考虑 TreeMap。HashMap 依赖 hashCode 与 equals,TreeMap 依赖比较规则。两者都不是内置线程安全容器,选择时还要明确 null 和并发约束。
讲清原理
HashMap 的基本操作在哈希分布良好时通常接近 O(1),但无排序保证;TreeMap 的 get、put、remove 保证 O(log n),并维护键顺序。这份额外工作换来了 floorKey、higherKey、subMap 等能力。
如果只是偶尔生成一次有序报表,也可以先用 HashMap 汇总,再把条目复制排序;若每次更新后都要范围导航,持续维护树可能更贴合。不能只看单次 get 的成本。
例子与易错点
Java 21 的 main 片段:
var slots = new java.util.TreeMap<Integer, String>();
slots.put(9, "早会");
slots.put(14, "评审");
slots.put(18, "复盘");
System.out.println(slots.floorKey(16));
System.out.println(slots.subMap(9, true, 18, false).keySet());
输出 14、[9, 14]。subMap 是连接原映射的范围视图,不是默认快照。TreeMap 按键比较,不能指望它自动把 value 按中文、价格或其他字段排好。
相关题:第 4 题、第 24 题、第 48 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。