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