1、它是有序的集合
实现了 SotredMap 接口:
1 | public class TreeMap<K,V> |
2、在调用 TreeMap 的构造函数时:
1)若指定了 Comparator
比较器,按照比较器来进行 key 的排序。
1 | public TreeMap(Comparator<? super K> comparator) { |
2)若未指定 Comparator
比较器,则按照 key 进行自然排序,key 必须实现 Comparable
接口。
1 | public TreeMap() { comparator = null; } |
3)或者传入有排序的 Map,SortedMap
1 | public TreeMap(Map<? extends K, ? extends V> m) { |
3、红黑树 Entry<K,V> root
每个 key-value 都作为一个红黑树的节点。
1 | // 红黑树的根节点 |
4、put方法
1 | public V put(K key, V value) { |
5、TreeMap 的键值可以为null
吗
1)键不建议为null,key为null 可能抛空指针
2)值可以为null。
- 未指定 Comparator 时,按key自然排序,key为null时 会抛出 NullPointerException
1 | public static void main(String[] args) { |
若指定 Comparator,若实现的比较器未对 null 键进行判断,可能抛出 NullPointerException;
若实现的比较器有对 null 键进行判断,可以存入,也能get。
1 | public static void main(String[] args) { |
6、TreeMap 中的 put方法 需要注意什么,尤其是key?
1)如果没有指定比较器,则键的类必须要实现
Comparable
接口。2)最好不要传入
null
键,要么抛错,要么容易引起问题。3)在定义比较方法,
Comparator
接口的compare
方法和Comparable
接口的compareTo
方法时,要注意返回结果为 0 则表示在TreeMap
的树上为同一节点,即表示相同节点,此时应考虑是否重写equals、hashCode
方法。4)比较结果为0,会直接进行
setValue
值替换。5)put方法返回什么:如果map中已经有 key 的映射,返回旧值
oldValue
;如果没有 key 的映射,则返回null
。
7、 TreeMap 的查找和新增时间复杂度
如果树节点数为 n,树的高度为 log (n)。
TreeMap 的查找和新增时间复杂度为 O (log (n))。
8、与LinkedHashMap
有序的区别:
LinkedHashMap 使用一个额外双向链表,记录插入顺序,所以它是根据插入顺序排序。
9、TreeSet
TreeSet 是一种可有序存放元素的集合,HashSet 是 value 为固定值的 HashMap,TreeSet 是 value 为固定值的TreeMap。
1 | // TreeSet 是 Value为固定值的 TreeMap |