set集合的TreeSet类
TreeSet 类
TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性.
它的底层是红黑树,用来确保元素的排序和唯一性的,基于map对象,TreeSet
是对TreeMap
的简单包装
红黑树:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点为空的是黑色。
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
上述第五个特性,如下图所示,80到20,60,100,140都只有一个黑节点,80到最下面的节点你会发现都是两个黑节点,也正是因为这样红黑树才是相对是接近平衡的二叉树。
在看代码:
测试类:
有五本书,每个大小不一样,第一次add的时候,集合里面没有值,直接添加,后5成为根节点
下面是书这个类,一定要实现Comparable这个接口,然后重写里面的compareTo方法,至于怎么实现,看你想以什么进行排序就按什么逻辑写
我这里是以书的size进行排序的
第二次add的时候,如下所示
水浒这本书和三国演义这本书的size进行比较
这里面逻辑很简单,如果是小于就返回-1,等于就返回0,大于就返回1。
此时集合里面有两本书,树的结构是这样:
然后第三次add的时候
此时红楼梦的size是3,所以只需要和根节点比较一次就行了,比根节点小,就直接存在了左边
此时set集合中第一个就是红楼梦了,而此时的树是这样的:
第四次add的时候
西游记的size是6,三国演义的size是5,所以走它的右节点,而它的右节点是水浒传
所以和水浒传的size比,6<7,所以存在左边
此时集合里面是这样的:
而树的结构是这样的:
第五次add的时候
你会发现最后这个宝莲灯这本书是没有存进去的,比的顺序是三国演义,水浒传,西游记,最后和西游记比的时候返回的是1,所以就没存进去,最后集合里面就四本书了