TreeMap
前言
- TreeMap实现了NavigableMap接口,并且NavigableMap继承
SortedMap
接口,所以TreeMap接口是有序的 - 底层实现是红黑树,方法的时间复杂度不高,log(n)
- 非同步的
- 解决相等问题、排序问题,使用Comparator或者Comparable接口比较
域
-
private final Comparator<? super K> comparator;
- 当comparator为null时,使用自然排序
-
private transient Entry<K,V> root;
- 红黑树的根节点
-
private transient int size = 0;
- 红黑树的大小
-
private transient int modCount = 0;
- 结构性修改次数,用于高并发
构造方法
4个构造方法
-
TreeMap()
-
public TreeMap() { comparator = null; }
-
设置
comparator
为null,让其为自然排序
-
-
TreeMap(Comparator<? super K> comparator)
-
public TreeMap(Comparator<? super K> comparator) { this.comparator = comparator; }
-
指定
comparator
, 不是自然排序了
-
-
TreeMap(Map<? extends K, ? extends V> m)
-
public TreeMap(Map<? extends K, ? extends V> m) { comparator = null; putAll(m); }
-
指定一个Map,通过调用putAll()方法,让传入的Map转换为TreeMap
-
Map<String, String> test = new LinkedHashMap<>(); //MAP TreeMap<String, String> treeMap = new TreeMap<>(test);
-
-
TreeMap(SortedMap<K, ? extends V> m)
-
public TreeMap(SortedMap<K, ? extends V> m) { comparator = m.comparator(); try { buildFromSorted(m.size(), m.entrySet().iterator(), null, null); } catch (java.io.IOException cannotHappen) { } catch (ClassNotFoundException cannotHappen) { } }
-
当传入的是
SortedMap
类型时,调用相应的buildFromSorted
方法,将SortedMap转换为TreeMap类型
-
自然排序
一直说到,comparator为null就是自然排序,那自然排序是指什么?
-
若value是整数的情况,自然排序指的是,(1,2,3,4,5,6,~)
TreeMap<String, Integer> test = new TreeMap<>(); for (int i = 0; i < 10; i++) { test.put("CT-RS" + (int) (Math.random() * 100), (int) (Math.random() * 100)); } for (Map.Entry<String, Integer> entry : test.entrySet()) { System.out.println(entry.getKey() + "-------------->" + entry.getValue()); }
-
默认按照 key 进行自然排序的