treeMap的成员变量:
private final Comparator<? super K> comparator;
**起什么作用**:key的比较器
**什么时候被初始化**:new treeMap对象时通
过构造方法初始化的
private transient Entry<K,V> root;
是什么:是treemap对应的红黑树的根节点
private transient int size = 0;
是什么:treemap对应树的总节点数-----
即treemap有几个Entry<K,V>实例对象
private transient int modCount = 0;
作用:记录树修改的次数
第一道流程:当前treemap中没有一个Entry<K,V>实例
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
}
第二道流程:当前treemap中有Entry<K,V>实例 且 treemap中存在形参的key
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
treemap中原本有 键值对( Entry<K,V>实例),所以不执行这里
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
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);
}
}
第三道流程:treemap中不存在形参的key
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
treemap中原本有 键值对( Entry<K,V>实例),所以不执行这里
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
if (cpr != null) {
因为比较器为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{
因为当前treemap中不存在形参中的key,所以不执行这里
}
} 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;
}
解释:treemap的成员变量比较器comparator不为null时
当前的treemap树中存在该节点》所以将该节点改为
形参的value值
第四道流程:
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
treemap中原本有 键值对( Entry<K,V>实例),所以不执行这里
}
int cmp;
Entry<K,V> parent;
// split comparator and comparable paths
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{因为树中不存在形参的key值,所以不执行};
} while (t != null);
}
Entry<K,V> e = new Entry<>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);//设置该节点是红还是黑(Entry的成员变量color)
size++;
modCount++;
return null;
}