Set集合,它类似于一个罐子,程序可以依次把多个对象 “丢进” Set 集合,而 Set 集合通常不能记住元素的添加的顺序,也就是说Set 集合是无序的。Set 集合与 Colleaction 基本相同,没有提供额外的方法,实际上 Set 就是 Collection,只是行为略有不同(Set 不允许包含重复元素)。

》HashSet 

  HashSet 类是 Set 接口的典型实现类,大多数时候使用 Set 集合时就是使用这个实现类。HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。

  HashSet 具有以下特点:

  》不能保证元素的排列顺序,顺序可能和添加的顺序不同,顺序也有可能发生变化。

  》HashSetf不是同步的,如果多个线程同时来访问一个 HashSet,假设有两个或者两个以上线程同时修改了HashSet 集合时,则必须通过代码来保证其同步。

  》集合元素值可以是 null。

public static void main(String[] args) {Dog ououDog=new Dog("欧欧","雪纳瑞");Dog yayaDog=new Dog("亚亚","拉布拉多");Dog meimeiDog=new Dog("美美","雪纳瑞");Dog feifeiDog=new Dog("菲菲","拉布拉多");Set dogs = new HashSet();//添加元素
        dogs.add(ououDog);  dogs.add(yayaDog);dogs.add(meimeiDog);dogs.add(feifeiDog);   //遍历集合中的元素for (Object item : dogs) {Dog dog=(Dog)item;System.out.println(dog.getName());}System.out.println(dogs.size());    //查看长度
        System.out.println(dogs.isEmpty());  //为空返回 true ,否则返回 false
        System.out.println(dogs.contains(feifeiDog));  //指定元素存在返回 true,否则返回false
        dogs.remove(feifeiDog);  //删除指定元素
        dogs.clear();   //清空集合当中的所有元素
        }

 》LinkedHashSet 

  HashSet 还有子类 LinkedHashSet, LinkedHashSet 集合也是根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。也就是说,当遍历 LinkedHashSet 将会按照添加元素顺序来访问集合里的元素。

  LinkedHashSet 需要维护元素的插入顺序,因此性能略低于 HashSet 的性能,但在迭代访问 Set 里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。虽然 LinkedHashSet 使用了链表记录集合元素的添加顺序,但 LinkedhasHSet依然是 HashSet,因此它依然不允许集合元素重复。

public static void main(String[] args) {Dog ououDog=new Dog("欧欧","雪纳瑞");Dog yayaDog=new Dog("亚亚","拉布拉多");Dog meimeiDog=new Dog("美美","雪纳瑞");Dog feifeiDog=new Dog("菲菲","拉布拉多");Set dogs=new LinkedHashSet();dogs.add(ououDog);  dogs.add(yayaDog);dogs.add(meimeiDog);dogs.add(feifeiDog);   for (Object item : dogs) {Dog dog=(Dog)item;System.out.println(dog.getName());}}

》TreeSet 

  TreeSet 是 SortedSet 接口的实现类,正如 SortedSet 名字所暗示的,TreeSet 可以确保集合元素处于排序状态。与HashSet 相比,TreeSet 还提供了几个额外的方法。

public static void main(String[] args) {TreeSet nums=new TreeSet();nums.add(5);nums.add(2);nums.add(10);nums.add(-9);nums.add(15);//自动排序    从小到大System.out.println(nums);   //输出 [-9, 2, 5, 10, 15]//输出集合元素的一个元素System.out.println(nums.first());    //输出 -9//输出集合元素的最后一个元素System.out.println(nums.last());     //输出 15//返回小于 4 的子集,不包含 4 System.out.println(nums.headSet(4)); //输出[-9, 2]//返回大于 5 的子集,子集中还包含5System.out.println(nums.tailSet(5)); //输出[5, 10, 15]//返回大于等于-3 、小于4的子集System.out.println(nums.subSet(-3, 4));  //输出[2]//返回小于指定元素 的最大元素,指定元素不需要非得是TreeSet集合里的元素System.out.println(nums.lower(11));//返回大于指定元素的最小元素System.out.println(nums.higher(3));//如果 TreeSet 采用了定制排序,则该方法返回定制排序所使用的 Comparator;如果采用自然排序,则返回 nullSystem.out.println(nums.comparator());}

》各 Set 实现类的性能分析

  HashSet 和 TreeSet 是 Set 的两个典型实现,到底如何选择 HashSet 和 TreeSet 呢?HashSet 的性能总是比 TreeSet 好(特比是常用的添加 、查询元素等操作),因为 TreeSet 需要额外的红黑树算法来维护集合元素的次序,只有当需要一个保持排序的 Set 时,才应该使用 TreeSet ,否则都应该使用 HashSet 。

  HashSet 还有一个子类 : LinkedHashSet ,对于普通的插入、删除操作,LinkedHashSet 比 HashSet 要略微慢一点,这是由于维护链表所带来的额外开销造成的,但由于有了链表,遍历 LinkedHashSet 会更块。

转载于:https://www.cnblogs.com/szj-ang/p/7380944.html

Java——Set 集合相关推荐

  1. java 数组集合转换_Java 实例 – 集合转数组

    Java 实例 - 集合转数组 以下实例演示了如何使用 Java Util 类的 list.add() 和 list.toArray() 方法将集合转为数组: /* author by w3cscho ...

  2. java icomparer_集合数据处理(C#、JavaScript 和 Java)

    Java 丢了好多年,最近在拣起来,首先当然是了解这么多年来它的变化,于是发现了 Java 8 的java.util.stream.在学习和试验的过程中,相比较于 C# 和 javascript,有那 ...

  3. java中集合的区别_Java中的集合与集合之间的区别

    Java收集框架用于操纵对象的收集.收集框架包含多个包装器类,便利类,用于传统实现的类,例如vector和Hashtable,收集接口等. 集合是Java集合框架中的接口.它分为两部分-Java ut ...

  4. Java面试集合(二)

    前言 大家好,给大家带来Java面试集合(二)的概述,希望你们喜欢 二 1.请问线程有哪些状态? 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked ...

  5. java中集合的排序

    java中集合的排序 import java.util.Set; import java.util.HashSet; import java.util.List; import java.util.A ...

  6. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

  7. java各种集合的线程安全

    转载自  java各种集合的线程安全 线程安全 首先要明白线程的工作原理,jvm有一个main memory,而每个线程有自己的working  memory,一个线程对一个variable进行操作时 ...

  8. Java Map集合面试题汇总

    转载自 Java Map集合面试题汇总 1. 你都知道哪些常用的Map集合? 2.Collection集合接口和Map接口有什么关系? 3.HashMap是线程安全的吗?线程安全的Map都有哪些?性能 ...

  9. java 读取集合到流中_Java 10:将流收集到不可修改的集合中

    java 读取集合到流中 Java 10引入了几种新方法来促进不可修改集合的创建. List.copyOf , Set.copyOf和Map.copyOf方法从现有实例创建新的集合实例. 例如: Li ...

  10. java中集合选取怎么选_集合中的可选

    java中集合选取怎么选 有时有人认为Optional类型值得在集合中使用. 据称,它解决了以下问题: HashMap在没有键映射以及值null映射到键的情况下返回null . 如果使用Map< ...

最新文章

  1. 第五课.可变图结构下的归纳式学习图注意力
  2. list of Java class file format major version numbers?
  3. Color the ball----HDOJ1556
  4. linux共享库位置配置(LD_LIBRARY_PATH环境变量 或者 更改/etc/ld.so.conf)
  5. vs2012打包和部署程序成可安装安装包文件(InstallShield
  6. Struts2_day01
  7. StarLake:汇量科技云原生数据湖的探索和实践
  8. 场效应管P-MOS N-MOS
  9. Android退出程序时的再按一次退出实现
  10. java post 注册_利用JAVA发送POST请求(垃圾注册就是这么产生的) | 学步园
  11. centos7 设备 mariadb-10
  12. 《Microduino实战》——2.2 兼容Arduino系列产品
  13. (原創) 如何Real Time產生灰階影像? (SOC) (DE2-70) (TRDB-D5M)
  14. 判别分析分为r型和q型吗_r型聚类分析
  15. 早悟兰因(兰因絮果)
  16. 用Latex写学术论文:作者(Author)摘要(Abstract)
  17. 用Python获取照片GPS信息
  18. 批处理命令更改Windows鼠标滑轮滚动方向
  19. CameraView Android 相机预览控件
  20. VB中ByVal与ByRef有什么区别

热门文章

  1. 浅议“全局变量”、“多线程”和“编译器陷阱”
  2. mysql---存储过程和函数
  3. 用户登录自动注销问题
  4. 解决flash builder 4.6调试不可用
  5. 高性能MMORPG服务端引擎设计之基本概念
  6. 网络游戏的客户端同步问题
  7. 【java学习之路】(javaWeb【后端】篇)001.XMLTomcatHttp协议
  8. 与同步传递相关的获取-释放序列
  9. Hive 开窗必需掌握的rankdense_rankrow_number
  10. SparkContext详述