一.概述

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

二.子接口

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

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

  

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

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

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

修饰符和返回值 方法名 描述
导航功能
E lower(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() 返回与原集合相反排序的集合
弹出功能
E pollFirst() 移除并返回集合第一个元素,集合为空时返回null
E pollLast() 移除并返回集合最后一个元素,集合为空时返回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只适用集合频繁迭代但很少修改的情景.

java 集合框架(四)Set的更多相关文章

  1. Java集合框架(四)

    Collections    集合框架的工具类    着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ...

  2. Java集合框架(四)-HashMap

    1.HashMap特点 存放的元素都是键值对(key-value),key是唯一的,value是可以重复的 存放的元素也不保证添加的顺序,即是无序的 存放的元素的键可以为null,但是只能有一个key ...

  3. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  4. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  5. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

  6. 【JAVA集合框架之List】

    一.List接口概述. List有个很大的特点就是可以操作角标. 下面开始介绍List接口中相对于Collection接口比较特别的方法.在Collection接口中已经介绍的方法此处就不再赘述. 1 ...

  7. Java集合框架使用总结

    Java集合框架使用总结 前言:本文是对Java集合框架做了一个概括性的解说,目的是对Java集合框架体系有个总体认识,如果你想学习具体的接口和类的使用方法,请参看JavaAPI文档. 一.概述数据结 ...

  8. java集合框架之java HashMap代码解析

     java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/arti ...

  9. 浅入深出之Java集合框架(上)

    Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...

随机推荐

  1. Protobuf 从入门到实战

    简介 从第一次接触Protobuf到实际使用已经有半年多,刚开始可能被它的名字所唬住,其实就它是一种轻便高效的数据格式,平台无关.语言无关.可扩展,可用于通讯协议和数据存储等领域. 优点 平台无关,语 ...

  2. lvs_nat

    nat模式环境模拟 1.实验环境概览 192.168.1.186 192.168.75.131 双网卡 dir 调度器(vip) ipvsadm,双网卡 192.168.1.185 单网卡 rs1 真 ...

  3. 聊聊js里面容易忽视的一些东西(1)

      JavaScript对象的创建方式 在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: 1 2 3 4 5 6 var o1 ...

  4. linux ss 命令

    ss 是 Socket Statistics 的缩写.ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似.但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连 ...

  5. 使用hexo搭建个人博客

    安装前提 node.js git 如果缺少以上条件,则前往相应的官网下载安装即可.. 安装hexo $ npm install hexo-cli -g 待安装完成后,执行相关命令查看hexo的信息. ...

  6. apache 限制IP访问

    <Directory "/var/www"> Options All AllowOverride None Order Deny,Allow Deny From all ...

  7. android adb shell input各种妙用

    项目中使用一个开发版,预留两个usb接口.类似华硕TinkerBoard. 一个用户连接摄像头,一个用于adb调试.结果就没了鼠标的接口.多次切换鼠标和摄像头插头,非常不方便,带摄像头的app没法调试 ...

  8. BZOJ 3879: SvT [虚树 后缀树]

    传送门 题意: 多次询问,给出一些后缀,求两两之间$LCP$之和 哈哈哈哈哈哈哈竟然$1A$了,刚才还在想如果写不好这道题下节数学就不上了,看来是上天让我上数学课啊 $Suffix\ Virtual\ ...

  9. C#常用代码片段备忘

    以下是从visual studio中整理出来的常用代码片段,以作备忘 快捷键: eh 用途: 类中事件实现函数模板 private void MyMethod(object sender, Event ...

  10. 走进JavaScript——重拾函数

    创建函数 通过构造器的方式来创建函数,最后一个参数为函数体其他为形参 new Function('a','b','alert(a)') /* function anonymous(a,b) { ale ...