一、TreeSet
1.当使用无参构造器,创建TreeSet时,仍然是无序的。
2.若希望添加的元素有序,需要使用TreeSet提供的构造器,传入一个比较器。
该比较器是一个接口,里面有一个方法叫compare(),传入一个实现该接口的类(匿名内部类)
而且可见,TreeSet构造器在底层其实是new一个TreeMap()
![](https://img-blog.csdnimg.cn/direct/220e2b120e19448aa14d66086bc0affe.png)
![](https://img-blog.csdnimg.cn/direct/6320cd2b107448b2a0a11f99cf1ce7f9.png)
![](https://img-blog.csdnimg.cn/direct/b860a75180a945b6a0d7f06cf15ac55d.png)
![](https://img-blog.csdnimg.cn/direct/790b3524f1d442469a8947a1beed7aa8.png)
底层:
add():
调用底层TreeMap的put()方法
![](https://img-blog.csdnimg.cn/direct/1743543fb50241cfb6781c7406d372ec.png)
二、TreeMap
底层为红黑树
源码:
构造器:
无参:
直接将comparator置为null。
![](https://img-blog.csdnimg.cn/direct/edec47157f454346bcffc6085e6c6051.png)
有参:
参数为实现Comparator接口的类:
![](https://img-blog.csdnimg.cn/direct/68fb8a1236bb416fb9f87a833444e187.png)
put:
如果root为null,即第一次加入,则直接加入
否则,将comparater赋值给cpr
若cpr不为空,则:
根据compare()进行判断,若等于0,则重新设置value,并返回旧值。
![](https://img-blog.csdnimg.cn/direct/0a2c9af7227940a79b550279d44f8278.png)
若cpr为空,则:
key为null,则抛出异常
key不为null,则采用默认的比较方法,
先将key转变成Comparable对象,如果Key实现了该对象,则可以转,String、包装类等都有实现该接口。
没有实现则会报错。
然后执行Key对象自身的compareTo()函数。
例如,两个String进行比较则调用String的compare()方法。
若两个key无法比较则会报错。
![](https://img-blog.csdnimg.cn/direct/4354ce76751648e19a1aa273d245093d.png)
然后设置改该节点为对应的左子树或右子树
再然后调用fixAfterInsertion()方法就是对这棵树进行调整、平衡。
最后size++ modCount++
![](https://img-blog.csdnimg.cn/direct/a8b806167936404c8df208685ff1d84c.png)
compare:
![](https://img-blog.csdnimg.cn/direct/e241309dbf634a51bf82b3dbe0e03521.png)