Set集合是Collection的子集,Set集合与Collection基本相同,没有提供任何额外的方法,只是Set不允许包含重复的元素。

Set集合3个实现类:HashSet、TreeSet、EnumSet

  

一、HashSet

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable

HashSet是Set接口的典型实现,HashSet按hash算法来存储元素,因此具有很好的存取和查找性能。它具有以下特点:

1、不能保证元素的排列顺序,顺序有可能发生变化。

2、HashSet是异步的。

3、集合元素值可以是null。

4、当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来确定该对象在HashSet中存储的位置。

  【注意】:HashSet判断两个元素相等的标准是:1、两个对象通过equals()比较相等;2、两个对象的hashCode()方法返回值相等。只有同时满足前面两个条件,HashSet才判断是同一个元素。

  HashSet还有一个子类LinkedHashSet,其集合也是根据元素hashCode值来决定元素的存储位置,但它同时用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说,当遍历LinkedHashSet集合元素时,它将会按元素的添加顺序来访问集合里的元素。所以LinkedHashSet的性能略低于HashSet,但在迭代访问全部元素时将有很好的性能,因为它以链表来维护内部顺序。

二、TreeSet 

public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable

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

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

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

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

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

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

6、SortedSet subSet(from Element,to Element):返回此set的子集合,范围从from Element到to Element(闭包)。

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

8、SortedSet tailSet(fromElement):返回此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会调用集合元素的compareTo(Object obj)方法来计较元素之间大小关系,然后将集合元素按升序排列。如果试图把一个对象加进TreeSet时,则该对象的类必须实现Comparable接口,否则程序将会出现ClassCastException异常。

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

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

三、EnumSet

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

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

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

  a、static EnumSet allOf(Class elementType):创建一个包含指定枚举类里所有枚举值的EnumSet集合。

  b、static EnumSet complementOf(EnumSet s):创建一个其元素类型与指定EnumSet里元素类型相同的EnumSet,新的EnumSet集合包含原EnumSet集合所不包

     含的、此枚举类剩下的枚举值。

  c、static EnumSet copyOf(collection c):使用一个普通集合来创建EnumSet集合。

  d、static EnumSet copyOf(EnumSet e):创建一个与指定EnumSet具有相同元素类型、相同集合元素的EnumSet。

  e、static EnumSet noneOf(Class elementType):创建一个元素类型为指定枚举类型的空EnumSet.

f、 static EnumSet of(E first,E...rest):创建一个包含一个或多个枚举值的EnumSet,传入的多个枚举值必须属于同一个枚举类。

  g、static EnumSet range(E from,E to):创建包含从from枚举值,到to枚举值范围内所有枚举值的EnumSet集合。

 enum Sesson{
SPRING,SUMMER,FALL,WINTER
} public class Test
{
public static void main(String[] args) throws ParseException{
//创建一个EnumSet集合,集合元素就是所有Sesson中的枚举值
EnumSet es1=EnumSet.allOf(Sesson.class);
System.out.println(es1); //[SPRING, SUMMER, FALL, WINTER]
//创建一个EnumSet空集合,其集合元素是Sesson类型的枚举
EnumSet es2=EnumSet.noneOf(Sesson.class);
System.out.println(es2); //[]
//手动添加元素
es2.add(Sesson.SUMMER);
es2.add(Sesson.SPRING);
System.out.println(es2); //[SPRING, SUMMER]
//以指定枚举值创建集合
EnumSet es3=EnumSet.of(Sesson.SUMMER,Sesson.WINTER);
System.out.println(es3); //[SUMMER, WINTER]
EnumSet es4=EnumSet.range(Sesson.SPRING, Sesson.FALL);
System.out.println(es4); //[SPRING, SUMMER, FALL]
EnumSet es5=EnumSet.complementOf(es4);
System.out.println(es5); //[WINTER]
}
}

总结:

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

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

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

30、Java中Set集合之HashSet、TreeSet和EnumSet的更多相关文章

  1. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  2. Java中的集合概述

    Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...

  3. Java开发知识之Java中的集合Set接口以及子类应用

    ---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...

  4. JAVA中的集合容器操作类

    目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...

  5. Java中各种集合(字符串类)的线程安全性!!!

    Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

  6. Java中的集合框架-Map

    前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从 ...

  7. Java中的集合框架-Collection(二)

    上一篇<Java中的集合框架-Collection(一)>把Java集合框架中的Collection与List及其常用实现类的功能大致记录了一下,本篇接着记录Collection的另一个子 ...

  8. 分享知识-快乐自己:Java中各种集合特点

    Java中各种集合特点: Collection[单列集合]: List(有序,可重复): ArrayList: 底层数据结构是数组,查询快,增删慢.线程不安全,效率高. Vector: 底层数据结构是 ...

  9. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

随机推荐

  1. Microsoft Composition (MEF 2)

    This packages provides a version of the Managed Extensibility Framework (MEF) that is lightweight an ...

  2. 10.2.2移动产品离线功能等具体解释----暨4月8日移动《在离线一体化》公开课Q&amp;A

    4月8日<离,或者不离,ArcGIS移动的"在离线一体化"就在那里!>移动公开课已经结束,针对公开课上粉丝们重点关注的问题,本博客进行了具体的解答.答疑主要环绕最新的R ...

  3. java代码将e.printStackTrace()写入log4j文件异常信息

    try { ... } catch (Exception e) { log.error( "failed!", e ); } 或者 try { ... } catch (Excep ...

  4. 实现Hadoop的Writable接口Implementing Writable interface of Hadoop

    As we saw in the previous posts, Hadoop makes an heavy use of network transmissions for executing it ...

  5. Redis中对Key进行分类

    使用":"体现层次 >set key1:key2:key4 value1 "OK" >set key1:key2:key5 value2 " ...

  6. @SpringContext通过实现ApplicationContextAware接口动态获取bean

    场景: 在代码中需要动态获取spring管理的bean 目前遇到的主要有两种场景:1.在工具类中需要调用某一个Service完成某一个功能,如DictUtils2.在实现了Runnable接口的任务类 ...

  7. 充满未来和科幻的界面设计FUI在国内还没有起步在国外早起相当成熟

    所谓FUI可以是幻想界面(Fantasy User Interfaces).科幻界面(Fictional User Interfaces).假界面(Fake User Interfaces).未来主义 ...

  8. go语言基础之数组做函数参数是值拷贝

    1.数组做函数参数是值拷贝 示例: package main //必须有个main包 import "fmt" //数组做函数参数,它是值传递 //实参数组的每个元素给形参数组拷贝 ...

  9. 曲线平滑-B样条曲线 【转】

    版权声明:本文为博主原创文章,未经博主允许不得转载. 3D空间曲线三次B样条平滑示例: struct D_DOT3D //D_DOT3D示例,未完全实现 { double x,y,z; } doubl ...

  10. Bridge 桥接模式 MD

    桥接模式 简介 将抽象部分与实现部分分离,使它们都可以独立的变化. 业务抽象角色引用业务实现角色,或者说业务抽象角色的部分实现是由业务实现角色完成的 Bridge模式基于类的最小设计原则,通过使用封装 ...