直接上代码
public V put(K key, V value) {//插入或设置元素,返回原始value值(如果插入返回null)
Entry<K,V> t = root;
if (t == null) {//根元素为空时直接建立根元素
// TBD:
// 5045147: (coll) Adding null to an empty TreeSet should
// throw NullPointerException
//
// compare(key, key); // type check
root = new Entry<K,V>(key, value, null);
size = 1;
modCount++;
return null;
}
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);//相等直接进行value设置
} while (t != null);
}
else {//不存在比较器,按compareTo方法查找
if (key == null)
throw new NullPointerException();
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<K,V>(key, value, parent);
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
疑问点在于,
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
上面这段代码的意思是,根据比较器想t移到原来节点的子节点。那么移动以后parent节点是原来的t,t变到了原来的子节点,那么下面这段代码又是什么意思呢。
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
让parent的左右节点成e(插入节点),那么岂不是跟t节点重复了?t阶段存在的意义到底是什么。