【本文是为了梳理知识的总结性文章,总结了一些自认为相关的重要知识点,只为巩固记忆以及技术交流,忘批评指正。其中参考了很多前辈的文章,包括图片也是引用,如有冒犯,侵删。】
0 存储结构
TreeMap 是一个有序的Map,内部按照Key的排序结果来组织。一般如果没有需要排序的情况下,我们都使用HashMap或者多线程下使用ConcurrentHashMap,因为TreeMap的插入和删除的效率没有前两者高。但是如果需要有序的Map,那么就只能选TreeMap了,HashMap是基于Hash散列的,因此是无序的。从底层实现来看,TreeMap 是基于红黑树实现的,在学习之前需要先了解红黑树的基础知识,可以参考数据结构之红黑树Java实现。
1 类定义
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
2 红黑树节点Entry结构
// 使用boolean值表示红黑树节点颜色
private static final boolean RED = false;
private static final boolean BLACK = true;
static final class Entry<K,V> implements Map.Entry<K,V> {
K key;
V value;
Entry<K,V> left; // 左子树
Entry<K,V> right; // 右子树
Entry<K,V> parent; // 父节点
boolean color = BLACK; // 节点颜色
Entry(K key, V value, Entry<K,V> parent) {
this.key = key;
this.value = value;
this.parent = parent;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
public V setValue(V value) {
V oldValue = this.value;
this.value = value;
return oldValue;
}
public boolean equals(Object o) {
if (!(o instanceof Map.Entry))
return false;
Map.Entry<?,?> e = (Map.Entry<?,?>)o;
return valEquals(key,e.getKey()) && valEquals(value,e.getValue());
}
public int hashCode() {
int keyHash = (key==null ? 0 : key.hashCode());
int valueHash = (value==null ? 0 : value.hashCode());
return keyHash ^ valueHash;
}
public String toString() {
return key + "=" + value;
}
}
3 属性
/**
* 用于维护此TreeMap中顺序的比较器,如果它为null,则使用key的自然顺序。
*/
private final Comparator<? super K> comparator;
// 树的根节点
private transient Entry<K,V> root;
/**
* 树中节点的个数
*/
private transient int size = 0;
/**
* 树进行结构性修改的次数
*/
private transient int modCount = 0;
4 构造函数
主要用于初始化 comparator