相同点
HashMap 定义:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
TreeMap 定义:
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
- 都继承了 AbstractMap <K, V>类,实现了 Cloneable 和 Serializable 接口
- 以键值对的形式存储元素,其中键是唯一的,而值可以重复
- 都是线程不安全的集合,要实现线程安全要么使用Collections.sychronizedMap(XXX),要么使用ConcurrentHashMap
- 都是fail-fast的,即迭代器遍历集合对象时,如果对集合对象进行了修改,将抛出ConcurrentModificationException,终止遍历
不同点
- **实现接口:**HashMap 实现了 Map 接口,而 TreeMap 实现的是 NavigableMap 接口。NavigableMap 是 SortedMap 的一种,实现了对 Map 中 key 的排序
- **key 排序:**HashMap 不对键执行排序,而 TreeMap 通过使用 compareTo() 方法或在 TreeMap 的构造函数中设置的比较器保留顺序。更进一步的,由于 key 排序 TreeMap 不允许异构元素,而 HashMap允许
- **数据结构:**HashMap 的底层数据结构是数组+链表+红黑树(基于哈希表),其中数组是主体,链表是为了解决hash冲突,红黑树是为了在链表过长时加快搜索效率而存在的。**其查找、插入和删除的时间复杂度为O(1)。**TreeMap 的底层数据结构只有红黑树(基于树),不支持链表操作,其查找、插入和删除的时间复杂度为O(logn)。在插入和删除节点的时候会进行重排序,对性能有影响
- **null 键/值:**HashMap 允许单个 null 键和多个 null 值,TreeMap 不允许使用 null 键但可以有多个 null 值
- **比较方法:**HashMap 使用 equals() 方法比较键,而 TreeMap 使用 compareTo() 方法比较键
HashMap 的红黑树和 TreeMap 的红黑树有什么区别
- HashMap 的红黑树是为了加快查询速度,而 TreeMap 的红黑树是为了对元素进行 key 排序,按照排序输出元素?
- HashMap 的红黑树节点个数不能无限增长,当集合中的节点数超过了阈值将会进行扩容,集合将进行扩容,原始的红黑树将可能退化成链表结构。而 TreeMap 是不存在类似于 HashMap 的扩容机制,其节点数是可以无限增长的。