- TreeMap 由红黑树实现,可以保持元素的自然顺序,或者实现了 Comparator 接口的自定义顺序
- 红黑树(英语:Red–black tree)是一种自平衡的二叉查找树(Binary Search Tree),结构复杂,但却有着良好的性能,完成查找、插入和删除的时间复杂度均为 log(n)。
自然顺序
- 默认情况下,TreeMap 是根据 key 的自然顺序排列的。
| |
| private transient int size = 0; |
| |
| |
| private final Comparator<? super K> comparator; |
| |
| public V put(K key, V value) { |
| |
| Entry<K, V> t = root; |
| |
| if (t == null) { |
| |
| compare(key, key); |
| |
| root = new Entry<>(key, value, null); |
| size = 1; |
| modCount++; |
| |
| return null; |
| } |
| int cmp; |
| Entry<K, V> parent; |
| |
| |
| Comparator<? super K> cpr = comparator; |
| if (cpr != null) { |
| |
| do { |
| |
| parent = t; |
| |
| cmp = cpr.compare(key, t.key); |
| if (cmp < 0) |
| |
| t = t.left; |
| else if (cmp > 0) |
| |
| t = t.right; |
| else |
| |
| return t.setValue(value); |
| } while (t != null); |
| } else { |
| |
| if (key == null) |
| throw new NullPointerException(); |
| @SuppressWarnings("unchecked") |
| |
| Comparable<? super K> k = (Comparable<? super K>) key; |
| do { |
| parent = t; |
| cmp = k.compareTo(t.key); |
| if (cmp < 0) |
| t = t.left; |
| else if (cmp > 0) |
| t = t.right; |
| else |
| return t.setValue(value); |
| } while (t != null); |
| } |
| |
| Entry<K, V> e = new Entry<>(key, value, parent); |
| if (cmp < 0) |
| |
| parent.left = e; |
| else |
| |
| parent.right = e; |
| |
| fixAfterInsertion(e); |
| size++; |
| modCount++; |
| return null; |
| } |
| public int compareTo(String anotherString) { |
| |
| int len1 = value.length; |
| int len2 = anotherString.value.length; |
| |
| int lim = Math.min(len1, len2); |
| |
| char v1[] = value; |
| char v2[] = anotherString.value; |
| |
| int k = 0; |
| |
| while (k < lim) { |
| char c1 = v1[k]; |
| char c2 = v2[k]; |
| |
| if (c1 != c2) { |
| return c1 - c2; |
| } |
| k++; |
| } |
| |
| return len1 - len2; |
| } |
自定义顺序
| public TreeMap(Comparator<? super K> comparator) { |
| this.comparator = comparator; |
| } |
Comparator.reverseOrder()
返回的是 Collections.ReverseComparator 对象,就是用来反转顺序的
| TreeMap<Integer, String> map = new TreeMap<>(Comparator.reverseOrder()); |
| private static class ReverseComparator |
| implements Comparator<Comparable<Object>>, Serializable { |
| private static final long serialVersionUID = 7207038068494060240L; |
| |
| |
| static final ReverseComparator REVERSE_ORDER |
| = new ReverseComparator(); |
| |
| public int compare(Comparable<Object> c1, Comparable<Object> c2) { |
| |
| return c2.compareTo(c1); |
| } |
| |
| |
| private Object readResolve() { return Collections.reverseOrder(); } |
| |
| |
| @Override |
| public Comparator<Comparable<Object>> reversed() { |
| return Comparator.naturalOrder(); |
| } |
| } |
排序的用处
| |
| Integer highestKey = map.lastKey(); |
| |
| Integer lowestKey = map.firstKey(); |
| |
| |
| Set<Integer> keysLessThan3 = map.headMap(3).keySet(); |
| |
| Set<Integer> keysGreaterThanEqTo3 = map.tailMap(3).keySet(); |
| |
| Map<Integer, String> headMap = map.headMap(3); |
| Map<Integer, String> tailMap = map.tailMap(4); |
| |
| Map<Integer, String> subMap = map.subMap(2, 4); |
Map的选择
特性 |
TreeMap |
HashMap |
LinkedHashMap |
排序 |
支持 |
不支持 |
不支持 |
插入顺序 |
不保证 |
不保证 |
保证 |
查找效率 |
O(log n) |
O(1) |
O(1) |
空间占用 |
通常较大 |
通常较小 |
通常较大 |
适用场景 |
需要排序的场景 |
无需排序的场景 |
需要保持插入顺序 |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18300969
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步