TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序。
TreeMap底层实现了树形结构,实现了红黑树的一个结构。TreeMap继承于AbstractMap,实现了Map, Cloneable, NavigableMap, Serializable接口。
获得最小与最大:
由于他的底层原理是一个红黑树,所以最小与最大实际上,就是取最左与最右。
successor方法/predecessor方法:
successor方法用来查找该节点的后续结点。predecessor方法用来查找前驱节点。
详细见转载博客:TreeMap方法successor/predecessor图解_dengjili的专栏-优快云博客
树的左旋与右旋方法:
fixAfterInsertion方法:
每次插入节点后都会默认调用的位置红黑树平衡的一个方法
/** From CLR */
private void fixAfterInsertion(Entry<K,V> x) {
x.color = RED;
while (x != null && x != root && x.parent.color == RED) {
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
Entry<K,V> y = rightOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == rightOf(parentOf(x))) {
x = parentOf(x);
rotateLeft(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
rotateRight(parentOf(parentOf(x)));
}
} else {
Entry<K,V> y = leftOf(parentOf(parentOf(x)));
if (colorOf(y) == RED) {
setColor(parentOf(x), BLACK);
setColor(y, BLACK);
setColor(parentOf(parentOf(x)), RED);
x = parentOf(parentOf(x));
} else {
if (x == leftOf(parentOf(x))) {
x = parentOf(x);
rotateRight(x);
}
setColor(parentOf(x), BLACK);
setColor(parentOf(parentOf(x)), RED);
rotateLeft(parentOf(parentOf(x)));
}
}
}
root.color = BLACK;
}
与之对应的fixAfterDeletion方法
是在删除结点时调用的,维持红黑树平衡的方法。
/** From CLR */
private void fixAfterDeletion(Entry<K,V> x) {
while (x != root && colorOf(x) == BLACK) {
if (x == leftOf(parentOf(x))) {
Entry<K,V> sib = rightOf(parentOf(x));
if (colorOf(sib) == RED) {
setColor(sib, BLACK);
setColor(parentOf(x), RED);
rotateLeft(parentOf(x));
sib = rightOf(parentOf(x));
}
if (colorOf(leftOf(sib)) == BLACK &&
colorOf(rightOf(sib)) == BLACK) {
setColor(sib, RED);
x = parentOf(x);
} else {
if (colorOf(rightOf(sib)) == BLACK) {
setColor(leftOf(sib), BLACK);
setColor(sib, RED);
rotateRight(sib);
sib = rightOf(parentOf(x));
}
setColor(sib, colorOf(parentOf(x)));
setColor(parentOf(x), BLACK);
setColor(rightOf(sib), BLACK);
rotateLeft(parentOf(x));
x = root;
}
} else { // symmetric
Entry<K,V> sib = leftOf(parentOf(x));
if (colorOf(sib) == RED) {
setColor(sib, BLACK);
setColor(parentOf(x), RED);
rotateRight(parentOf(x));
sib = leftOf(parentOf(x));
}
if (colorOf(rightOf(sib)) == BLACK &&
colorOf(leftOf(sib)) == BLACK) {
setColor(sib, RED);
x = parentOf(x);
} else {
if (colorOf(leftOf(sib)) == BLACK) {
setColor(rightOf(sib), BLACK);
setColor(sib, RED);
rotateLeft(sib);
sib = leftOf(parentOf(x));
}
setColor(sib, colorOf(parentOf(x)));
setColor(parentOf(x), BLACK);
setColor(leftOf(sib), BLACK);
rotateRight(parentOf(x));
x = root;
}
}
}
setColor(x, BLACK);
}
常用方法:
public Map.Entry ceilingEntry(K key)
返回指定的Key大于或等于的最小值的元素,如果没有,则返回null
public K ceilingKey(K key)
返回指定的Key大于或等于的最小值的Key,如果没有,则返回null
public Comparator super K> comparator()
如果使用默认的比较器,就返回null,如果使用其他的比较器,则返回比较器的哈希码值
public NavigableSet descendingKeySet()
返回集合的全部Key,并且是逆序的
public NavigableMap descendingMap()
把集合逆序返回
public Map.Entry firstEntry()
返回集合中最小Key的元素
public K firstKey()
返回集合中最小Key的key
public Map.Entry floorEntry(K key)
与ceilingEntry()方法相反,是返回小于等于key的最大Key的元素
public K floorKey(K key)
返回小于等于key的最大Key的key
public SortedMap headMap(K toKey)
返回Key小于toKey的所有元素
public NavigableMap headMap(K toKey, boolean inclusive)
当inclusive为true时,就是返回Key小于等于toKey的所有元素
public Map.Entry higherEntry(K key)
返回Key大于key的所有元素
public K higherKey(K key)
返回Key大于key的所有Key
public Map.Entry lastEntry()
返回Key最大的元素
public K lastKey()
返回Key最大的Key
public Map.Entry lowerEntry(K key)
返回小于key的最大元素
public K lowerKey(K key)
返回小于key最大的Key
public Map.Entry pollFirstEntry()
删除key最小的元素
public Map.Entry pollLastEntry()
删除最大Key的元素
public NavigableMap subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
截取集合中Key从fromKey到toKey的元素,false则是会截取他们本身
public NavigableMap tailMap(K fromKey, boolean inclusive)
当inclusive为true时,截取Key大于等于fromKey的所有元素,否则截取Key大于fromKey的所有元素