简要介绍
- TreeSet简介
- TreeSet
是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet,
Cloneable, java.io.Serializable接口。 - TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
- TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
- TreeSet 实现了Cloneable接口,意味着它能被克隆。
- TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
- TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
- TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。
源码
略
使用
public static void main(String[] args) {
testTreeSetAPIs();
}
// 测试TreeSet的api
public static void testTreeSetAPIs() {
String val;
// 新建TreeSet
TreeSet tSet = new TreeSet();
// 将元素添加到TreeSet中
tSet.add("aaa");
// Set中不允许重复元素,所以只会保存一个“aaa”
tSet.add("aaa");
tSet.add("bbb");
tSet.add("eee");
tSet.add("ddd");
tSet.add("ccc");
System.out.println("TreeSet:" + tSet);
// 打印TreeSet的实际大小
System.out.println("tSet.size():"+tSet.size());
// 导航方法
// floor(小于、等于)
System.out.println("floor bbb:"+tSet.floor("bbb"));
// lower(小于)
System.out.println("lower bbb:"+tSet.lower("bbb"));
// ceiling(大于、等于)
System.out.println("ceiling bbb:" + tSet.ceiling("bbb"));
System.out.println("ceiling eee:"+tSet.ceiling("eee"));
// ceiling(大于)
System.out.println("higher bbb:"+tSet.higher("bbb"));
// subSet()
System.out.println("subSet(aaa, true, ccc, true):"+tSet.subSet("aaa", true, "ccc", true));
System.out.println("subSet(aaa, true, ccc, false):"+ tSet.subSet("aaa", true, "ccc", false));
System.out.println("subSet(aaa, false, ccc, true):"+ tSet.subSet("aaa", false, "ccc", true));
System.out.println("subSet(aaa, false, ccc, false):"+ tSet.subSet("aaa", false, "ccc", false));
// headSet()
System.out.println("headSet(ccc, true): "+ tSet.headSet("ccc", true));
System.out.println("headSet(ccc, false):"+tSet.headSet("ccc", false));
// tailSet()
System.out.println("tailSet(ccc, true):"+tSet.tailSet("ccc", true));
System.out.println("tailSet(ccc, false):"+ tSet.tailSet("ccc", false));
// 删除“ccc”
tSet.remove("ccc");
// 将Set转换为数组
String[] arr = (String[]) tSet.toArray(new String[0]);
for (String str : arr)
System.out.printf("for each : %s\n", str);
// 打印TreeSet
System.out.println("TreeSet:"+tSet);
// 遍历TreeSet
for (Iterator iter = tSet.iterator(); iter.hasNext();) {
System.out.println("iter :"+iter.next());
}
// 删除并返回第一个元素
val = (String) tSet.pollFirst();
System.out.println("pollFirst="+val+"set="+tSet);
// 删除并返回最后一个元素
val = (String) tSet.pollLast();
System.out.println("pollLast="+val+"set="+tSet);
// 清空HashSet
tSet.clear();
// 输出HashSet是否为空
System.out.println("tSet.isEmpty():"+tSet.isEmpty());
}
/************************打印结果*************************
TreeSet:[aaa, bbb, ccc, ddd, eee]
tSet.size():5
floor bbb:bbb
lower bbb:aaa
ceiling bbb:bbb
ceiling eee:eee
higher bbb:ccc
subSet(aaa, true, ccc, true):[aaa, bbb, ccc]
subSet(aaa, true, ccc, false):[aaa, bbb]
subSet(aaa, false, ccc, true):[bbb, ccc]
subSet(aaa, false, ccc, false):[bbb]
headSet(ccc, true): [aaa, bbb, ccc]
headSet(ccc, false):[aaa, bbb]
tailSet(ccc, true):[ccc, ddd, eee]
tailSet(ccc, false):[ddd, eee]
for each : aaa
for each : bbb
for each : ddd
for each : eee
TreeSet:[aaa, bbb, ddd, eee]
iter :aaa
iter :bbb
iter :ddd
iter :eee
pollFirst=aaaset=[bbb, ddd, eee]
pollLast=eeeset=[bbb, ddd]
tSet.isEmpty():true
************************************************************/
重点总结
TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。
TreeSet是非线程安全的。
TreeSet实现java.io.Serializable的方式。当写入到输出流时,依次写入“比较器、容量、全部元素”;当读出输入流时,再依次读取。