1 packagejava.util;2
3 public class TreeSet extends AbstractSet
4 implements NavigableSet, Cloneable, java.io.Serializable5 {6 //NavigableMap对象
7 private transient NavigableMapm;8
9 //TreeSet是通过TreeMap实现的,10 //PRESENT是键-值对中的值。
11 private static final Object PRESENT = newObject();12
13 //不带参数的构造函数。创建一个空的TreeMap
14 publicTreeSet() {15 this(new TreeMap());16 }17
18 //将TreeMap赋值给 "NavigableMap对象m"
19 TreeSet(NavigableMapm) {20 this.m =m;21 }22
23 //带比较器的构造函数。
24 public TreeSet(Comparator super E>comparator) {25 this(new TreeMap(comparator));26 }27
28 //创建TreeSet,并将集合c中的全部元素都添加到TreeSet中
29 public TreeSet(Collection extends E>c) {30 this();31 //将集合c中的元素全部添加到TreeSet中
32 addAll(c);33 }34
35 //创建TreeSet,并将s中的全部元素都添加到TreeSet中
36 public TreeSet(SortedSets) {37 this(s.comparator());38 addAll(s);39 }40
41 //返回TreeSet的顺序排列的迭代器。42 //因为TreeSet时TreeMap实现的,所以这里实际上时返回TreeMap的“键集”对应的迭代器
43 public Iteratoriterator() {44 returnm.navigableKeySet().iterator();45 }46
47 //返回TreeSet的逆序排列的迭代器。48 //因为TreeSet时TreeMap实现的,所以这里实际上时返回TreeMap的“键集”对应的迭代器
49 public IteratordescendingIterator() {50 returnm.descendingKeySet().iterator();51 }52
53 //返回TreeSet的大小
54 public intsize() {55 returnm.size();56 }57
58 //返回TreeSet是否为空
59 public booleanisEmpty() {60 returnm.isEmpty();61 }62
63 //返回TreeSet是否包含对象(o)
64 public booleancontains(Object o) {65 returnm.containsKey(o);66 }67
68 //添加e到TreeSet中
69 public booleanadd(E e) {70 return m.put(e, PRESENT)==null;71 }72
73 //删除TreeSet中的对象o
74 public booleanremove(Object o) {75 return m.remove(o)==PRESENT;76 }77
78 //清空TreeSet
79 public voidclear() {80 m.clear();81 }82
83 //将集合c中的全部元素添加到TreeSet中
84 public boolean addAll(Collection extends E>c) {85 //Use linear-time version if applicable
86 if (m.size()==0 && c.size() > 0 &&
87 c instanceof SortedSet &&
88 m instanceofTreeMap) {89 SortedSet extends E> set = (SortedSet extends E>) c;90 TreeMap map = (TreeMap) m;91 Comparator super E> cc = (Comparator super E>) set.comparator();92 Comparator super E> mc =map.comparator();93 if (cc==mc || (cc != null &&cc.equals(mc))) {94 map.addAllForTreeSet(set, PRESENT);95 return true;96 }97 }98 return super.addAll(c);99 }100
101 //返回子Set,实际上是通过TreeMap的subMap()实现的。
102 public NavigableSet subSet(E fromElement, booleanfromInclusive,103 E toElement, booleantoInclusive) {104 return new TreeSet(m.subMap(fromElement, fromInclusive,105 toElement, toInclusive));106 }107
108 //返回Set的头部,范围是:从头部到toElement。109 //inclusive是是否包含toElement的标志
110 public NavigableSet headSet(E toElement, booleaninclusive) {111 return new TreeSet(m.headMap(toElement, inclusive));112 }113
114 //返回Set的尾部,范围是:从fromElement到结尾。115 //inclusive是是否包含fromElement的标志
116 public NavigableSet tailSet(E fromElement, booleaninclusive) {117 return new TreeSet(m.tailMap(fromElement, inclusive));118 }119
120 //返回子Set。范围是:从fromElement(包括)到toElement(不包括)。
121 public SortedSetsubSet(E fromElement, E toElement) {122 return subSet(fromElement, true, toElement, false);123 }124
125 //返回Set的头部,范围是:从头部到toElement(不包括)。
126 public SortedSetheadSet(E toElement) {127 return headSet(toElement, false);128 }129
130 //返回Set的尾部,范围是:从fromElement到结尾(不包括)。
131 public SortedSettailSet(E fromElement) {132 return tailSet(fromElement, true);133 }134
135 //返回Set的比较器
136 public Comparator super E>comparator() {137 returnm.comparator();138 }139
140 //返回Set的第一个元素
141 publicE first() {142 returnm.firstKey();143 }144
145 //返回Set的最后一个元素
146 publicE first() {147 publicE last() {148 returnm.lastKey();149 }150
151 //返回Set中小于e的最大元素
152 publicE lower(E e) {153 returnm.lowerKey(e);154 }155
156 //返回Set中小于/等于e的最大元素
157 publicE floor(E e) {158 returnm.floorKey(e);159 }160
161 //返回Set中大于/等于e的最小元素
162 publicE ceiling(E e) {163 returnm.ceilingKey(e);164 }165
166 //返回Set中大于e的最小元素
167 publicE higher(E e) {168 returnm.higherKey(e);169 }170
171 //获取第一个元素,并将该元素从TreeMap中删除。
172 publicE pollFirst() {173 Map.Entry e =m.pollFirstEntry();174 return (e == null)? null: e.getKey();175 }176
177 //获取最后一个元素,并将该元素从TreeMap中删除。
178 publicE pollLast() {179 Map.Entry e =m.pollLastEntry();180 return (e == null)? null: e.getKey();181 }182
183 //克隆一个TreeSet,并返回Object对象
184 publicObject clone() {185 TreeSet clone = null;186 try{187 clone = (TreeSet) super.clone();188 } catch(CloneNotSupportedException e) {189 throw newInternalError();190 }191
192 clone.m = new TreeMap(m);193 returnclone;194 }195
196 //java.io.Serializable的写入函数197 //将TreeSet的“比较器、容量,所有的元素值”都写入到输出流中
198 private voidwriteObject(java.io.ObjectOutputStream s)199 throwsjava.io.IOException {200 s.defaultWriteObject();201
202 //写入比较器
203 s.writeObject(m.comparator());204
205 //写入容量
206 s.writeInt(m.size());207
208 //写入“TreeSet中的每一个元素”
209 for (Iterator i=m.keySet().iterator(); i.hasNext(); )210 s.writeObject(i.next());211 }212
213 //java.io.Serializable的读取函数:根据写入方式读出214 //先将TreeSet的“比较器、容量、所有的元素值”依次读出
215 private voidreadObject(java.io.ObjectInputStream s)216 throwsjava.io.IOException, ClassNotFoundException {217 //Read in any hidden stuff
218 s.defaultReadObject();219
220 //从输入流中读取TreeSet的“比较器”
221 Comparator super E> c = (Comparator super E>) s.readObject();222
223 TreeMaptm;224 if (c==null)225 tm = new TreeMap();226 else
227 tm = new TreeMap(c);228 m =tm;229
230 //从输入流中读取TreeSet的“容量”
231 int size =s.readInt();232
233 //从输入流中读取TreeSet的“全部元素”
234 tm.readTreeSet(size, s, PRESENT);235 }236
237 //TreeSet的序列版本号
238 private static final long serialVersionUID = -2479143000061671589L;239 }