在Java面试中,HashMap
和TreeMap
是集合框架中常被问到的知识点,二者都实现了Map
接口,但在底层结构、性能特性等方面有显著区别。以下是面试中常考的区别总结:
Comparable
)或自定义比较器(Comparator
)排序,遍历时按排序后的顺序输出。
null
(仅允许一个null
键),且键需正确实现hashCode()
和equals()
方法(否则可能导致数据异常,如元素无法查找)。
null
(会抛出NullPointerException
),且键必须可比较:
Comparable
接口,TreeMap
时传入自定义Comparator
。操作 | HashMap | TreeMap |
---|---|---|
插入(put) | 平均O(1),最坏O(n) | O(log n) |
查询(get) | 平均O(1),最坏O(n) | O(log n) |
删除(remove) | 平均O(1),最坏O(n) | O(log n) |
遍历(按序) | 需额外排序(O(n log n)) | 天然有序(O(n)) |
HashMap
略高。HashMap
有扩容机制(默认容量16,负载因子0.75),当元素数量超过阈值时会扩容为原来的2倍;
TreeMap
无扩容概念,红黑树会自动平衡。
Collections.synchronizedMap()
)或使用并发实现(如ConcurrentHashMap
)。
hashCode()
决定元素在哈希表中的存储位置,equals()
用于判断键是否相同。Comparable
的compareTo()
方法或Comparator
的compare()
方法,红黑树会根据比较结果维护有序结构。HashMap
(性能更优),除非明确需要排序功能才选择TreeMap
。总结:二者的核心区别在于有序性和底层结构,选择时需根据是否需要排序、操作频率(插入/查询)等场景决定。