今天看了一下TreeSet的源码,
发现TreeSet的add方法通过NavigableMap接口实例调用了TreeMap的put方法
但是TreeSet并没有实现NavigableMap接口或者继承TreeMap。
为什么可以这么调用呢
TreeSet 的内部变量是 TreeMap实现的,它实际的操作都是通过这个内部变量实现的。
TreeSet的底层实现相似于TreeMap,可以将TreeSet看作TreeMap的vlalue值为object,而TreeSet值可以认为TreeMap的键,依次可以知道,TreeSet的比较用法;
TreeSet实现了SortedSet接口,而SortedSet继承自Set接口,所以TreeSet间接地继承了Set接口。SortedSet接口中定义了很多按照不同排序方式排序的方法,其中包括naturalOrder()方法和comparator()方法。TreeSet类实现了这些方法,而这些方法正是通过调用TreeMap的对应方法实现的。在调用TreeSet的add方法时,add方法会根据是否定义了Comparator来决定用naturalOrder还是Comparator来排序。因此,TreeSet可以使用TreeMap的方法,是因为它实现了SortedSet接口,并重写了SortedSet中声明的方法。至于TreeSet的逻辑实现,它的底层使用了TreeMap来实现,TreeSet集合中存储了不包含值对象的TreeMap对象。