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. Tomcat – java.lang.OutOfMemoryError: PermGen space Cause and Solution

    Read more: http://javarevisited.blogspot.com/2012/01/tomcat-javalangoutofmemoryerror-permgen.html#ix ...

  2. python测试开发django-5.模板templates

    前言 html是一个静态的语言,里面没法传一些动态参数,也就是一个写死的html页面.如果想实现在一个固定的html样式,传入不同的参数,这就可以用django的模板传参来解决. 模板参数 先在hel ...

  3. [翻译] AnimatedPath 动画路径(持续更新)

    AnimatedPath动画路径 感谢原作者分享精神,有空补上使用教程 https://github.com/twotoasters/AnimatedPath AnimatedPath explore ...

  4. 解决sqoop 导入oracle表时 --split-by参数为日期类型时的报错:ORA-01861: literal does not match format string

    报错栈: -- ::, INFO [main] org.apache.sqoop.mapreduce.db.DBRecordReader: Executing query: select " ...

  5. VMware+Windgb+Win7内核驱动调试

    com1被占用了,需要用com2

  6. 如何利用启明星Portal门户系统的Page模块构建工作流表单

    启明星门户网站的Pages模块支持构建自定义表单系统.这使得对于使用表单收集用户数据的需求来说非常有用. 本文介绍如何构建一个简单的“出差系统”. 1.在页面里增加Pages模块,建立人事部部门,然后 ...

  7. Android Studio体验(一)--Window版本安装

    如果说之前看见有人用Android Studio你还是不屑一顾的话,那么现在该改变态度了,正如我一样,之前一直习惯于Android内置ADT插件的捆绑Ecliple,现在Android Studio发 ...

  8. EasyUI-Tooltip(提示框)学习

    引子: if($("#BLUETOOTH_a")){ $("#BLUETOOTH_a").tooltip({ position: 'right', conten ...

  9. Medication Reconciliation Overview

    http://www.hcsinc.net/HCS-Medication-Reconciliation/med-rec-overview.html At HCS, we've worked with ...

  10. SSIS包部署错误之运行环境设置

    在SQLServer代理处新建了一个job,步骤里面的操作是指向一个SSIS模型包 执行,报错如下 根据报错信息是64bit,于是做出修改如下图 再次执行 OK