博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java——Set 集合
阅读量:5136 次
发布时间:2019-06-13

本文共 3663 字,大约阅读时间需要 12 分钟。

  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 的子集,子集中还包含5        System.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;如果采用自然排序,则返回 null        System.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

你可能感兴趣的文章
CentOS 7.2.1511编译安装Nginx1.10.1+MySQL5.6.33+PHP5.6.26
查看>>
代理模式和装饰模式区别
查看>>
为什么要用面向对象的编程方式?
查看>>
iOS之侧滑界面实现
查看>>
User-Agent
查看>>
关于hadoop的一些研究优化方向
查看>>
Emoji表情代码大全
查看>>
IDEA + SpringBoot + maven 项目文件说明
查看>>
BZOJ3252 攻略(贪心+dfs序+线段树)
查看>>
博客园的异常处理机制是怎么样的
查看>>
Git教程 Git与SVN的区别
查看>>
深入理解Java的接口和抽象类
查看>>
mysql 全量备份以及增量备份
查看>>
【计算机视觉】期刊整理
查看>>
【Linux开发】linux中关于dma_alloc_coherent的用法
查看>>
Sublime 输入中文显示方框问号乱码
查看>>
bootstrap-datepicker宽度高度自适应
查看>>
字符串函数
查看>>
带返回值的存储过程
查看>>
表格测试
查看>>