Set:无顺序,不包含重复的元素

HashSet:为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。

TreeSet: 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。

LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。

HashSet:

  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. HashSet set = new HashSet();
  7. //分别向books集合中添加两个A对象,两个B对象,两个C对象
  8. set.add(new A());
  9. set.add(new A());
  10.  
  11. set.add(new B());
  12. set.add(new B());
  13.  
  14. set.add(new C());
  15. set.add(new C());
  16. System.out.println(set);
  17. System.out.println(set.size());
  18. for(Iterator iter = set.iterator(); iter.hasNext();){
  19. Object value = iter.next();
  20. System.out.println(value);
  21. }
  22. }
  23. }
  24.  
  25. //类A的equals方法总是返回true,但没有重写其hashCode()方法。不能保证当前对象是HashSet中的唯一对象
  26. class A
  27. {
  28. public boolean equals(Object obj)
  29. {
  30. return true;
  31. }
  32. }
  33.  
  34. //类B的hashCode()方法总是返回1,但没有重写其equals()方法。不能保证当前对象是HashSet中的唯一对象
  35. class B
  36. {
  37. public int hashCode()
  38. {
  39. return 1;
  40. }
  41. }
  42.  
  43. //类C的hashCode()方法总是返回2,且有重写其equals()方法
  44. class C
  45. {
  46. public int hashCode()
  47. {
  48. return 2;
  49. }
  50. public boolean equals(Object obj)
  51. {
  52. return true;
  53. }
  54. }

Result:

  1. [com.qhong.B@1, com.qhong.B@1, com.qhong.C@2, com.qhong.A@677327b6, com.qhong.A@1540e19d]
  2. 5
  3. com.qhong.B@1
  4. com.qhong.B@1
  5. com.qhong.C@2
  6. com.qhong.A@677327b6
  7. com.qhong.A@1540e19d

B类的hashcode值一样,但是没有定义equals,所以存储了两个对象,但是对象因为hashcode一样,存储位置也一样,两个对象按链表方式存储。

C类中hashcode值一样,equals也一样,所以只能存储一个值。

A类中没有定义hashcode,所以存储位置不一样,这里还没有进行equals对比,一样存储两个对象。

LinkedHashSet

  1. import java.util.Iterator;
  2. import java.util.LinkedHashSet;
  3.  
  4. public class Main {
  5. public static void main(String[] args) {
  6. LinkedHashSet books = new LinkedHashSet();
  7. books.add("Java1");
  8. books.add("Java2");
  9. System.out.println(books);
  10.  
  11. //删除 Java
  12. books.remove("Java1");
  13. //重新添加 Java
  14. books.add("Java1");
  15. System.out.println(books);
  16. for(Iterator iter = books.iterator(); iter.hasNext();){
  17. Object value = iter.next();
  18. System.out.println(value);
  19. }
  20. }
  21. }

Result:

  1. [Java1, Java2]
  2. [Java2, Java1]
  3. Java2
  4. Java1

元素的顺序总是与添加顺序一致,LinkedHashSetTest是HashSet的子类,因此它不允许集合元素重复.

TreeSet:

  1. import java.util.TreeSet;
  2.  
  3. public class Main {
  4. public static void main(String[] args) {
  5. TreeSet nums = new TreeSet();
  6. //向TreeSet中添加四个Integer对象
  7. nums.add(5);
  8. nums.add(2);
  9. nums.add(10);
  10. nums.add(-9);
  11.  
  12. //输出集合元素,看到集合元素已经处于排序状态
  13. System.out.println(nums);
  14.  
  15. //输出集合里的第一个元素
  16. System.out.println(nums.first());
  17.  
  18. //输出集合里的最后一个元素
  19. System.out.println(nums.last());
  20.  
  21. //返回小于4的子集,不包含4
  22. System.out.println(nums.headSet(4));
  23.  
  24. //返回大于5的子集,如果Set中包含5,子集中还包含5
  25. System.out.println(nums.tailSet(5));
  26.  
  27. //返回大于等于-3,小于4的子集。
  28. System.out.println(nums.subSet(-3 , 4));
  29. }
  30. }

Result:

  1. [-9, 2, 5, 10]
  2. -9
  3. 10
  4. [-9, 2]
  5. [5, 10]
  6. [2]

与HashSet集合采用hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元素。

TreeSet支持两种排序方式: 自然排序、定制排序

TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排序,即自然排序。

通过ComparaTor接口可以实现定制排序。

  1. import java.util.Comparator;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4.  
  5. public class Main {
  6. public static void main(String[] args) {
  7. TreeSet ts = new TreeSet(new Comparator()
  8. {
  9. //根据M对象的age属性来决定大小
  10. public int compare(Object o1, Object o2)
  11. {
  12. M m1 = (M)o1;
  13. M m2 = (M)o2;
  14. return m1.age > m2.age ? -1 : m1.age < m2.age ? 1 : 0;
  15. }
  16. });
  17. ts.add(new M(5));
  18. ts.add(new M(-3));
  19. ts.add(new M(9));
  20. System.out.println(ts);
  21. for(Iterator iter = ts.iterator(); iter.hasNext();){
  22. Object value = iter.next();
  23. System.out.println(value);
  24. }
  25. }
  26. }
  27. class M
  28. {
  29. int age;
  30. public M(int age)
  31. {
  32. this.age = age;
  33. }
  34. public String toString()
  35. {
  36. return "M[age:" + age + "]";
  37. }
  38. }

Result:

  1. [M[age:9], M[age:5], M[age:-3]]
  2. M[age:9]
  3. M[age:5]
  4. M[age:-3]

EnumSet:

  1. import java.util.EnumSet;
  2.  
  3. public class Main {
  4. public static void main(String[] args) {
  5. //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
  6. EnumSet es1 = EnumSet.allOf(Season.class);
  7. //输出[SPRING,SUMMER,FALL,WINTER]
  8. System.out.println(es1);
  9.  
  10. //创建一个EnumSet空集合,指定其集合元素是Season类的枚举值。
  11. EnumSet es2 = EnumSet.noneOf(Season.class);
  12. //输出[]
  13. System.out.println(es2);
  14. //手动添加两个元素
  15. es2.add(Season.WINTER);
  16. es2.add(Season.SPRING);
  17. //输出[SPRING,WINTER]
  18. System.out.println(es2);
  19.  
  20. //以指定枚举值创建EnumSet集合
  21. EnumSet es3 = EnumSet.of(Season.SUMMER , Season.WINTER);
  22. //输出[SUMMER,WINTER]
  23. System.out.println(es3);
  24.  
  25. EnumSet es4 = EnumSet.range(Season.SUMMER , Season.WINTER);
  26. //输出[SUMMER,FALL,WINTER]
  27. System.out.println(es4);
  28.  
  29. //新创建的EnumSet集合的元素和es4集合的元素有相同类型,
  30. //es5的集合元素 + es4集合元素 = Season枚举类的全部枚举值
  31. EnumSet es5 = EnumSet.complementOf(es4);
  32. //输出[SPRING]
  33. System.out.println(es5);
  34. }
  35. }
  36. enum Season
  37. {
  38. SPRING,SUMMER,FALL,WINTER
  39. }

Result:

  1. [SPRING, SUMMER, FALL, WINTER]
  2. []
  3. [SPRING, WINTER]
  4. [SUMMER, WINTER]
  5. [SUMMER, FALL, WINTER]
  6. [SPRING]

Set集合类应用场景:

  1. 1) HashSet的性能总是比TreeSet好(特别是最常用的添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。只有当需要一个保持排序的Set时,才应该使用TreeSet,否则都应该使用HashSet
  2. 2) 对于普通的插入、删除操作,LinkedHashSetHashSet要略慢一点,这是由维护链表所带来的开销造成的。不过,因为有了链表的存在,遍历LinkedHashSet会更快
  3. 3) EnumSet是所有Set实现类中性能最好的,但它只能保存同一个枚举类的枚举值作为集合元素
  4. 4) HashSetTreeSetEnumSet都是"线程不安全"的,通常可以通过Collections工具类的synchronizedSortedSet方法来"包装"Set集合。
  5. SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

http://www.cnblogs.com/LittleHann/p/3690187.html

Java Set操作的更多相关文章

  1. Java实现操作dos命令

    java实现操作dos命令的两种方式 1.读取文件中的命令 package com; import java.io.InputStream; public class cmd { public sta ...

  2. JAVA 链表操作:循环链表

    主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...

  3. java日期操作大全

    摘自(http://www.blogjava.net/i369/articles/83483.html) java日期操作 大全 先来一个:  取得指定月份的第一天与取得指定月份的最后一天  http ...

  4. Java CSV操作(导出和导入)

    Java CSV操作(导出和导入)  CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...

  5. Java开发--操作MongoDB

    http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过前一篇文章我们 ...

  6. hive-通过Java API操作

    通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...

  7. HDFS的Java客户端操作代码(HDFS的查看、创建)

    1.HDFS的put上传文件操作的java代码: package Hdfs; import java.io.FileInputStream; import java.io.FileNotFoundEx ...

  8. Java文件操作源码大全

    Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...

  9. Java路径操作具体解释

    1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或文件夹在硬盘上真正的路径.(URL和物理路径)比如: C:\xyz\test.txt 代表了test.txt文件的绝对路径.http://w ...

  10. Java 文件操作大全

    Java 文件操作大全 //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPat ...

随机推荐

  1. elasticsearch插件大全

    Elasticsearch扩展性非常好,有很多官方和第三方开发的插件,下面以分词.同步.数据传输.脚本支持.站点.其它这几个类别进行划分. 分词插件 Combo Analysis Plugin (作者 ...

  2. linux查看时间和修改时间

    查看当前时间,date -R 设置时间 date -s 例如当前时间2014年11月3日17:22:48 date -s 11/3/2014 date -s 17:22:48 先设置日期后设置具体时间 ...

  3. Apache Spark源码走读之11 -- sql的解析与执行

    欢迎转载,转载请注明出处,徽沪一郎. 概要 在即将发布的spark 1.0中有一个新增的功能,即对sql的支持,也就是说可以用sql来对数据进行查询,这对于DBA来说无疑是一大福音,因为以前的知识继续 ...

  4. Unity4.5版本DLL库名字问题

      背景 在unity4.2版本中可以在Android中使用的so链接库,在Unity4.5中使不了-- [DllImport("libclient.so", EntryPoint ...

  5. 云计算中心网络资源分配-Faircloud: sharing the network in cloud computing

    网络资源同计算资源以及存储资源一样,是一种可被租户共享使用并提高利用率的资源.但是,不同租户的计算资源以及存储资源之间,有很强的隔离性,可以实现按需按比例分配的使用方式,但是网络资源却不可以. 主要原 ...

  6. Turing Test

    Computer Science An Overview _J. Glenn Brookshear _11th Edition In the past the Turing test (propose ...

  7. Flink - FlinkKafkaConsumer08

      先看 AbstractFetcher 这个可以理解就是,consumer中具体去kafka读数据的线程,一个fetcher可以同时读多个partitions的数据来看看 /** * Base cl ...

  8. for循环经典案例

    1.棋盘放粮食棋盘有32个格子,第一个格子放1个芝麻,第二个放2个,第三个放4个,第四个放8个...每个芝麻的重量为0.00001kg,如果要放满整个棋盘,需要多少重量的芝麻. <!DOCTYP ...

  9. java CountDownLatch

    Listing -. Using a Countdown Latch to Trigger a Coordinated Start import java.util.concurrent.CountD ...

  10. Bluetooth Security Manager

    一.概念     The Security Manager defines methods of pairing and key distribution, a protocol for those ...