以下为个人见解,如有错误,欢迎指正。
TreeSet的底层是TreeMap,TreeMap的底层是二叉树数据结构。TreeSet/TreeMap可以对元素按照大小自动排序。
二叉树排序有三种:
前序排序:根左右
中序排序:左根右
后序排序:左右根
TreeSet/TreeMap是采用中序排序。
在【TreeMap】码源有二叉树的节点有5个属性。在【TreeMap】源码中可以找到。
key,value,left:左节点,right:右节点,parent:父节点。
【TreeSet对Integer类的数据自动排序】
TreeSet<Integer> tree1 =new TreeSet<>();
tree1.add(10);
tree1.add(25);
tree1.add(15);
tree1.add(4);
tree1.add(15);
for(Integer s:tree1){
System.out.println(s);
}
//结果
4
10
15
25
说明TreeSet/TreeMap的特点:有序不可重复。
在创建对象的时候,调用的了【TreeSet】无参构造方法,【TreeSet】无参构造方法调用了【TreeMap】无参构造方法,在【TreeMap】无参构造方法中,比较器comparator为null。
打开【TreeSet】码源。
点击【TreeMap】。
【添加元素】
点击【add】,到达了【TreeSet】码源中的add方法
本质为调用了【TreeMap】的码源中的【put】方法。
【也就是说TreeSet的add方法本质是调用了TreeMap的put方法】
在【TreeMap】码源中搜索【put】方法,码源较长,复制过来。
//【码源】
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;
}
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