真的会发生什么?
TreeSet
固有地用于TreeMap
实现其功能。descendingSet()
最终调用实例descendingMap()
上的函数的调用TreeMap
,从以下源代码中可以明显看出:
public NavigableSet<E> descendingSet() {
return new TreeSet<>(m.descendingMap());
}
凡人TreeMap
普遍持有两种观点:
- 正常排序视图:使用通用比较器对其元素进行排序
- 后代地图视图:使用比较器,它强制升序比较器的反向排序。它用于
Collections.reverseOrder(m.comparator())
返回此降序比较器。
我之所以这样称呼它们view
,是因为TreeMap
它实际上并没有用它的entry(key, value)创建另一个后代 Map ,而是它维护了两个比较器,彼此施加相反的顺序。descendantMap()
调用时第一次创建后代视图。对该函数的任何后续调用都将返回相同的后代 Map 视图。
注意: set.descendingSet().descendingSet()
返回一个set
基本上等同于的视图set
。因为第一次调用的结果比较器被第二次调用(实际上是在内部执行)再次反转。descendingSet()
map.descendingMap()
继续您的示例:
System.out.printf("%n Higher than 40 : %s", set.higher(40)); // prints 45
set = set.descendingSet(); // create a reverse ordering
//comparator as described above
System.out.printf("%n Higher than 40 : %s", set.higher(40)); // prints 34
set = set.descendingSet(); // again trying to get descending set!
System.out.printf("%n Higher than 40 : %s", set.higher(40)) // prints 45