今天学习了TreeSet,你不来看一下吗?
发布时间
阅读量:
阅读量
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;
}
刚开始学西二叉树,不知道分析的对不对,请大佬们指正…万分感激
今天(0722)再回来看一下put方法,添加的元素相同,则返回V----value的值,因为TreeSet只添加了一个元素(虽然是add方法,但是底层是用put方法实现的),是用TreeMap来保存–即V–value始终为空
而 TreeMap是以键值对存储的,所以添加的元素相同时则返回V----value的值不是null
全部评论 (0)
还没有任何评论哟~
