TreeSet与EnumSet

来源:互联网 发布:windows vista 镜像 编辑:程序博客网 时间:2024/06/06 03:53

TreeSet

TreeSetSortSet接口的唯一实现,TreeSet可以确保集合元素处于排序状态。与HashSet相比,TreeSet还提供了几个额外的方法:

1Comparator comparator():返回当前set使用的Comparator,或者返回null,表示以自然方式排序。

2Object first():返回集合中的第一个元素。

3Object last():返回集合中的最后一个元素。

4Object lowerObject e):返回集合中位于指定元素之前的一个元素。

5Object higherObject e):返回集合中位于指定元素之后的一个元素。

6SortedSet subSetfrom Elementto Element):返回此set的子集合,范围从from Elementto Element(闭包)。

7SortedSet headSettoElement):返回此Set的子集,由小于toElement的元素组成。

8SortedSet tailSetfromElement):返回此Set的子集,由大于等于fromElement的元素组成。

 

public static void main(String[] args) {   TreeSet num=new TreeSet();   num.add(5);   num.add(2);    num.add(10);   num.add(-9);     System.out.println(num);        //输出:[-9,2,5,10]集合元素已经处于排序状态     System.out.println(num.first());    //输出-9     System.out.println(num.last());    //输出10);     System.out.println(num.headSet(4));  //输出-9,2返回小于4的子集     System.out.println(num.tailSet(5));    //输出5,10返回大于等于5的子集     System.out.println(num.subSet(-9,5));  //输出-9,2返回大于等于-9小于5的子集}

根据上面程序可以看出,TreeSet不是根据元素插入顺序进行排序的,而是根据元素的值来排序的。TreeSet支持两种排序方法:自然排序和定制排序。

1、自然排序:TreeSet会调用集合元素的compareToObject obj)方法来计较元素之间大小关系,然后将集合元素按升序排列。如果试图把一个对象加进TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会出现ClassCastException异常。

2、定制排序:如果需要实现定制排序,则可以使用Compa接口的帮助,该接口包含一个int compareo1,o2)方法,该方法用于计较两个数的大小,如果返回正整数,则表明o1>o2;如果返回0,则表明o1=o2;如果返回负整数,则表明o1<02

注意:不可以向TreeSet中添加类型不同的对象,否则会引起ClassCastException异常。


EnumSet

1EnumSet中所有值都必须是指定枚举类型的值,它的元素也是有序的,以枚举值在枚举类的定义顺序来决定集合元素的顺序。

2EnumSet集合不允许加入null元素,否则会抛出NullPointerException异常。

3EnumSet类没有暴露任何构造器来创建该类的实例,程序应该通过它提供的static方法来创建EnumSet对象,常用的static方法如下:

static EnumSetallOfClass elementType):创建一个包含指定枚举类里所有枚举值的EnumSet集合。
static EnumSet complementOf
EnumSet s):创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet,新的EnumSet集合包含原EnumSet集合所不包含的、此枚举类剩下的枚举值。
static EnumSet copyOf
collection c):使用一个普通集合来创建EnumSet集合。
static EnumSet copyOf
EnumSet e:创建一个与指定EnumSet具有相同元素类型、相同集合元素的EnumSet
static EnumSet noneOf
ClasselementType):创建一个元素类型为指定枚举类型的空EnumSet.
static EnumSet of(E first,E...rest):
创建一个包含一个或多个枚举值的EnumSet,传入的多个枚举值必须属于同一个枚举类。
static EnumSet range
E fromE to):创建包含从from枚举值,到to枚举值范围内所有枚举值的EnumSet集合。

public static void main(String[] args) {     EnumSet e1=EnumSet.allOf(Season1.class);          //创建一个EnumSet集合,集合元素就是Season里的全部枚举值     System.out.println(e1);         //输出[SPRING, SUMMER, FALL, WINTER]    EnumSet e2=EnumSet.noneOf(Season1.class);     //创建一个EnumSet空集合,指定其集合元素是season1的枚举值    e2.add(Season1.WINTER);    e2.add(Season1.SPRING);    System.out.println(e2);    //输出[SPRING, WINTER]   EnumSet e3=EnumSet.of(Season1.SUMMER, Season1.WINTER);  //以指定枚举值创建EnumSet集合    System.out.println(e3);        //输出[SUMMER, WINTER]  EnumSet e4=EnumSet.range(Season1.SUMMER, Season1.WINTER);    System.out.println(e4);         //输出[SUMMER, FALL, WINTER]  EnumSet e5=EnumSet.complementOf(e4);    System.out.println(e5);      //输出[SPRING]}

总结:

1HashSet的性能比Treeset好,因为TreeSet需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的Set时,才会用TreeSet

2EnumSet是性能最好的,但它只能保存枚举值。

3、它们都是线程不安全的


0 0
原创粉丝点击