java中集合部分是比较常用的,也会企业要求必须精通的部分; 所以喽,作为小白的我只能看源码度日了; 话不多说,看东西;
public class TodayTest {
public static void main(String[] args) {
TreeSet<Integer> set= new TreeSet<Integer>();
set.add(111);
set.add(100);
set.add(101);
for (Integer integer : set) {
System.out.println(integer);
}
}
}
为什么TreeSet添加的数据会进行排序?
回顾— 先看List接口---- ArrayList 添加的数据是按照添加顺序排列的,可以添加重复数据; 底层是数组来实现的; LinkedList添加数据也是按照添加顺序进行排列的,也可以添加重复数据; 底层是数组+链表即哈希表实现的;
ListIterator在迭代时候可以添加数据、移除数据 Iterator在迭代式只可以移除数据
set接口---- HasSet–添加的数据是无序的,且不能重复 底层是哈希表,且要实现hashcode和equals方法 LinkedHashSet --添加数据是按照添加顺序添加的,因为底层是数组+链表的形式(双向链表)
调用构造器– public TreeMap() { comparator = null; } 可以发现该构造器中–comparator = null;
private final Comparator<? super K> comparator;
TreeSet中add方法的实现–
红黑树---- 设置树的颜色的;
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;
}
刚开始学西二叉树,不知道分析的对不对,请大佬们指正…万分感激
|