核心结论
在面试或实际开发中,选择 HashMap 还是 TreeMap 主要看两个维度:是否需要有序 以及 对性能的要求。
如果你需要迭代时键值保持自然顺序或自定义顺序,必须用 TreeMap;如果只关注插入、删除和查找的效率,且不需要排序,HashMap 是首选。因为 HashMap 的性能通常优于 TreeMap。
底层实现差异
理解两者的区别有助于更好地选型:
- HashMap:基于哈希表(Hash Table)。Key 通过
hashCode()分布,数据存储在桶(数组)中,冲突时使用链表或红黑树解决。它不保证元素的顺序,适合高频的增删查操作。 - TreeMap:基于红黑树(Red-Black Tree)。Key 必须实现
Comparable接口或传入Comparator。迭代时默认按 Key 升序排列。由于涉及树的平衡调整,其读写性能略低于 HashMap,但提供了有序的遍历能力。
线程安全提示
这两个类都是非线程安全的。如果在多线程环境下使用,HashMap 可能导致死循环或数据覆盖,TreeMap 则可能抛出异常。生产环境建议分别使用 ConcurrentHashMap 或 Collections.synchronizedSortedMap 包装。
进阶:如何让 TreeMap 降序排列
TreeMap 默认是升序,如果需要降序,可以通过自定义比较器来实现。核心逻辑是在 compare 方法中返回相反的结果。
这里有一个小技巧:在返回比较结果前加个负号,就能反转排序方向。
public class MapTest {
public static void main(String[] args) {
// 初始化自定义比较器,实现降序
Comparator<String> comparator = (o1, o2) -> -o1.compareTo(o2);
// 将比较器传入 TreeMap 构造方法
Map<String, String> map = new TreeMap<>(comparator);
// 存入数据
map.put("a", "a");
map.put("b", "b");
map.put("f", "f");
map.put("d", "d");
map.put("c", "c");
map.put(, );
(String key : map.keySet()) {
System.out.println(map.get(key));
}
}
}


