java set treeset_Java 集合系列17之 TreeSet详细介绍(源码解析)和使用示例

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值