一、概述
1、TreeSet(樹集)是一個有序集合,可以按照任何順序將元素插入該集合,當對該集合進行迭代時,各個值將自動以排序后的順序出現。TreeSet中的元素按照升序排列,缺省是按照自然順序進行排序,意味着TreeSet中的元素要實現Comparable接口,或者有一個自定義的比較器Comparator。
2、TreeSet底層使用的是TreeMap,TreeMap的底層實現是紅黑樹(詳細見http://www.cnblogs.com/xujian2014/p/4645943.html)。
public TreeSet() { this(new TreeMap<E,Object>()); }
二、TreeSet使用示例
public class Test { public static void main(String[] args) { TreeSet<String> treeSet=new TreeSet<>(); treeSet.add("Bili"); treeSet.add("Amy"); treeSet.add("cDy"); for (String string : treeSet) { System.out.println(string); } }
由於String類實現了Comparable接口,它的compareTo方法是按照字典順序來對字符串進行排序,所以結果如下:
如果想插入自定義的對象,必須通過實現Comparable接口來定義一個排列的順序,eg:
class Person implements Comparable<Person> { int age; String name; String address; public Person(int age, String name) { super(); this.age = age; this.name = name; } @Override public int compareTo(Person o) { return this.age-o.age; } } public class TestMain { public static void main(String[] args) { TreeSet<Person> treeSet=new TreeSet<Person>(); treeSet.add(new Person(12, "xujian")); treeSet.add(new Person(6, "luyang")); treeSet.add(new Person(10, "xiewei")); for (Person person : treeSet) { System.out.println(person.name+":"+person.age); } } }
執行結果如下:
當然也可以自定義一個比較器Comparator,實現compare方法。
注意:
1、TreeSet的排列順序必須是全局順序,也就是說任何兩個元素都是必須可比的,同時只有當他們比較相同時才返回0。
2、如果樹集包含了n個元素,那么平均需要進行log2n次比較,才能找到新元素的正確位置。