1. 下面代码输出结果为
1 | Set<String> words = new TreeSet<String> (); |
- 结果:
hash map tree
- 分析
TreeSet
经常也只是当作Set
使用TreeSet
实现了两点:去重和有序
2. 接上题,如果希望忽略大小写进行比较排序,代码实现为
1 | Set<String> words = new TreeSet<String> (new Comparator<String> () { |
- 结果:
[hash, map, tree]
- 分析
Set
是去重的,去重是基于比较的结果,结果为 0 即视为相同map
和Map
虽然不同,但比较结果为 0,所以只会保留第一个元素
3. TreeSet
的实现原理
TreeSet
内部是基于TreeMap
实现的TreeSet
内部成员有1
2private transient NavigableMap<E, Object> m;
private static final Object PRESENT = new Object();m
就是背后的那个TreeMap
,这里用的是更为通用的接口类型NavigableMap
,PRESENT
就是那个固定的共享值TreeSet
的方法实现主要就是调用m
的方法TreeSet
的特点与TreeMap
基本一致- 按键有序,
TreeMap
同样实现了SortedMap
和NavigableMap
接口,可以方便地根据键的顺序进行查找,如第一个、最后一个、某一范围的键、临近键等 - 为了按键有序,
TreeMap
要求键实现Comparable
接口或通过构造方法提供一个Comparator
比较器对象 - 根据键保存、查找、删除的效率比较高,为
O(h)
,h
为树的高度,在树平衡的情况下,h = log2(N)
,N
为节点数 - 不要求排序,优先考虑
HashMap
;要求排序,考虑TreeMap
- 按键有序,