当前位置: 首页 > news >正文

java 集合框架(四)Set

一.概述

  Set是一种没有重复元素的集合,它所有的方法都是直接继承自Collection接口,并且添加了一个对重复元素的限制.Set要求强化了equals和hashCode两个方法,以使Set集合可以对元素进行排序和对比.

二.子接口

  Set中没有新添方法,而是在子接口SortedSet和NavigableSet中拓展了一些功能

修饰符和返回值方法名描述
端点操作
Efirst()返回当前集合第一个元素(低位),没有时抛出异常
Elast()返回当前集合最后一个元素(高位),没有时抛出异常
视图选取
SortedSet<E>subSet(E,E)返回指定两元素间元素组成的集合
SortedSet<E>headSet(E)返回指定元素之前元素组成的集合,不包含指定元素
SortedSet<E>tailSet(E)返回指定元素之后元素组成的集合,包含指定元素
排序器
Comparator<? extend E>comparator()返回排序器

  

  SortedSet内的元素以自然排序方式维持升序排序,或者依照指定的排序器排序,SortedSet集合相比Set添加了以下对元素操作的方式

  • 视图--允许从SortedSet截取并返回任意范围的元素视图
  • 端点操作---可以直接获取集合头或尾的元素
  • 排序器---返回用于排列元素的排序器

  需要格外注意的是,SortedSet视图的端点指向的是存储元素的内存空间,而不是给定的端点元素,视图仅仅是一个查看原集合的窗口,因此任何对视图的操作都会影响原集合,反之亦然.SortedSet在选取视图的时候,需要给定视图的截取的端点,并且含头不含尾,如果想要一个闭区间,同时包含两端点,可以在尾端点后加”/0”(空白字符),这样按照自然排序,前面一个字符自然就是我们给定的尾端点元素.

修饰符和返回值方法名描述
导航功能
Elower(E)返回指定对象之前的元素,没有时返回null
floor(E) 返回小于或等于指定对象的元素,没有时返回null
higher(E) 返回指定对象之后的元素,没有时返回null
ceiling(E) 返回大于或等于指定对象的元素,没有时返回null
视图选取
NavigableSet<E>subSet(E,boolean,E,boolean)返回指定端点间元素组成的集合,布尔值决定是否包含指定元素
NavigableSet<E>headSet(E,boolean)返回指定端点前元素组成的集合,布尔值决定是否包含指定元素
NavigableSet<E>tailSet(E,boolean) 返回指定端点后元素组成的集合,布尔值决定是否包含指定元素
NavigableSet<E>decendingSet()返回与原集合相反排序的集合
弹出功能
EpollFirst()移除并返回集合第一个元素,集合为空时返回null
EpollLast()移除并返回集合最后一个元素,集合为空时返回null
迭代器
Iterator<E>decendingIterator()获取集合的降序迭代器

  NavigableSet接口继承自SortedSet,视图操作上相比SortedSet,NavigableSet不仅多了一个decendingSet()获取反相排序的集合,而且subSet,headSet,tailSet还多了一个boolean类型参数,这个参数决定返回集合视图中是否包含给定的元素.NavigableSet还有一系列的导航方法,可以更具给定对象在集合内向前或向后寻找满足条件的元素

三.实现

  Set接口的实现分为通用实现和专用实现

  1.通用实现

  通用实现类主要有三个HashSet,LinkedHashSetTreeSet.

  HashSet通过哈希表存储元素,它是Set通用类中性能最好的一个,但不保证元素的排序.

  TreeSet以红黑树结构存储数据,它的元素按一定规则排序,所以他的性能要比HashSet差许多.

  LinkedHashSet在HashSet的基础上,增添了一个链表结构,来保证数据的按插入先后存储有序,因为需要维持一个链表,所以它的性能比HashSet稍微差一点,介于HashSet和TreeSet之间.

  HashSet的性能开销在集合内元素数和集合容量上都是线性的,因此HashSet初始化太大会浪费空间和时间,太小的话,在扩容的时候数据结构的拷贝浪费很多时间,如果不指定初始化大小,集合容量默认是16.过去指定一个初始化大小有一定好处,但现在不再是这样了.HashSet还有一个被称为负载系数的调优参数,但一般都是使用默认值,如果不设定负载系数的话,我们最好将初始化大小定义为两倍我们需要的值,即使用不到这么多,一般也不是什么大问题

  2.专用实现

  专用实现类主要有两个,EnumSetCopyOnWriteArraySet.

  EnumSet是一个高性能的枚举类型的Set实现类,其内部元素必须都是相同的枚举类型.

  CopyOnWriteArraySet是一个支持COW(copy-on-write)机制的集合.CopyOnWriteArraySet对集合的任何修改操作如,add,remove,set时,都会先复制一份,所以在CopyOnWriteArraySet可以安全的并发进行迭代和元素插入删除操作,不需要同步锁,实现了读写分离,但是读操作不具备实时性.CopyOnWriteArraySet只适用集合频繁迭代但很少修改的情景.

转载于:https://www.cnblogs.com/bushi/p/6669542.html

相关文章:

  • 数据库分库分表(sharding)系列(四) 多数据源的事务处理
  • NSTimer+倒计时功能实现
  • 轮播1-animate-匀速
  • PhantomJS 安装
  • 翻转式用户登录注册界面设计
  • Web应用防护系统OpenWAF开源CC防护模块
  • python运算符优先级
  • 设计模式C++实现——模板方法模式
  • 第四(装饰器、迭代器、生成器)
  • windows下实现快捷键截图小工具
  • 【jQuery】学习jQuery插件的使用与写法(表单验证插件-validation)
  • Oracle使用row_number()函数查询时增加序号列
  • 【Java基础】序列化与反序列化深入分析
  • Elasticsearch前沿:ES 5.x改进详解与ES6展望
  • 一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • angular2 简述
  • extract-text-webpack-plugin用法
  • javascript面向对象之创建对象
  • node入门
  • PHP CLI应用的调试原理
  • php面试题 汇集2
  • Spring Cloud中负载均衡器概览
  • spring学习第二天
  • 读懂package.json -- 依赖管理
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​你们这样子,耽误我的工作进度怎么办?
  • #includecmath
  • (function(){})()的分步解析
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (剑指Offer)面试题34:丑数
  • (三)终结任务
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • .aanva
  • .NET 8.0 中有哪些新的变化?
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .py文件应该怎样打开?
  • @ComponentScan比较
  • @JoinTable会自动删除关联表的数据
  • [AIGC codze] Kafka 的 rebalance 机制
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C++]模板与STL简介
  • [HTTP]HTTP协议的状态码
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [leetcode]56. Merge Intervals归并区间
  • [office] 图文演示excel怎样给单元格添加下拉列表 #知识分享#经验分享
  • [Python进阶] 消息框、弹窗:pywin32
  • [PyTorch][chapter 60][强化学习-2-有模型学习2]