public class TreeSet{
private static final Object PRESENT = new Object();
//1-1. 调用无参构造函数
public TreeSet() {
this(new TreeMap());
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeSet(SortedSet s) {
this(s.comparator());
addAll(s);
}
//实际调用的是TreeMap的put方法
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
//-------------以下是TreeMap的源码------------------
private final Comparator<? super K> comparator;
private transient Entry root;
private transient int size = 0;
private transient int modCount = 0;
//1-2.没有传入外部比较器,外部比较器为空,使用元素自己实现的内部比较器
public TreeMap() {
comparator = null;
}
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
//2-1.调用put方法 key=Student{id=1, name='lili'} value=PRESENT
//3-1.添加第二个元素 key=Student{id=2, name='huahua'}
//4-1.添加第三个元素 key=Student{id=3, name='xixi'}
public V put(K key, V value) {
//2-2.t = null
//3-2. t= root=Student{id=1, name='lili'}
//4-2. t= root=Student{id=1, name='lili'}
Entry t = root;
if (t == null) {
//2-3.进入compare方法 key=key=Student{id=1, name='lili'}
//compare(key,key) 3种可能,要么>0的数,要么=0,要么<0的数
compare(key, key); // type (and possibly null) check
//2-4.给root赋值 root=Student{id=1, name='lili'}
root = new Entry<>(key, value, null);
size = 1;
modCount++;
//2-5.添加第一个元素结束
return null;
}
int cmp;
Entry parent;
// split comparator and comparable paths
Comparator<? super K> cpr = comparator;
//外部比较器除了compara方法参数是两个之外,其余都一样。
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 {
//3-3.TreeMap不能添加null
if (key == null)
throw new NullPointerException();
@SuppressWarnings("unchecked")
Comparable<? super K> k = (Comparable<? super K>) key;
do {
//4-5.parent=Student{id=2, name='huahua'}
parent = t;
//3-4.当前元素=Student{id=2, name='huahua'}跟root=Student{id=1, name='lili'}比较
//4-3.当前元素=Student{id=3, name='xixi'}跟root=Student{id=1, name='lili'}比较
//4-6.当前元素=Student{id=3, name='xixi'}跟t=Student{id=2, name='huahua'}比较
cmp = k.compareTo(t.key);
if (cmp < 0)
//3-5.如果当前元素小,t=null
t = t.left;
else if (cmp > 0)
//3-6.当前元素>root,t=t.right=null
//4-4. 当前元素>root, t=t.right=Student{id=2, name='huahua'}
//4-7.当前元素>t,t=t.right=null
t = t.right;
else
//返回老值
return t.setValue(value);
} while (t != null);
}
//3-7.创建当前元素Student{id=2, name='huahua'}的Entry实例
//4-8.创建当前元素Student{id=3, name='xixi'}的Entry实例
Entry e = new Entry<>(key, value, parent);
if (cmp < 0)
//3-8.如果当前元素小,就放到root的左边
parent.left = e;
else
//3-9.如果当前元素大,就放到root的右边
//4-9.当前元素Student{id=3, name='xixi'}放到parentStudent{id=2, name='huahua'}的右边
parent.right = e;
//3-10. 红黑树的过程
//4-10. 红黑树后改变形态,下一次root会变,以此类推
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
//有外部比较器时用外部比较器,没有外部比较器用要插入的元素的内部比较器,并且实现compareTo方法
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
private void fixAfterInsertion(Entry x) {
x.color = RED;
while (x != null && x != root && x.parent.color == RED) {
if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
Entry 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 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;
}
//------------内部类Entry的源码-------------------------
public V setValue(V value) {
V oldValue = this.value;
this.value = value;
return oldValue;
}
}