java集合------Set

一.概述

  Set是一种没有重复元素的集合,Set 注重独一无二的性质,该体系集合用于存储无序(存入和取出的顺序不一定相同)元素,值不能重 复它所有的方法都是直接继承自Collection接口,并且添加了一个对重复元素的限制.Set要求强化了equals和hashCode两个方法,以使Set集合可以对元素进行排序和对比,对象的相等性本质是对象 hashCode 值(java 是依据对象的内存地址计算出的此序号)判断 的,如果想要让两个不同的对象视为相等的,就必须覆盖 Object 的 hashCode 方法和 equals 方 法。

 

HashSetHash 表)

哈希表边存放的是哈希值。HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不

同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的

hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较

equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是

同一个元素。

哈希值相同 equals 为 false 的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相

同的元素放在一个哈希桶中)。也就是哈希一样的存一列。如图 1 表示 hashCode 值不相同的情

况;图 2 表示 hashCode 值相同,但 equals 不相同的情况。

HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元

TreeSet(二叉树)

1. TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增

加一个对象都会进行排序,将对象插入的二叉树指定的位置。

2. Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,

己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使

用。

3. 在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序

4. 比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整

数、零或正整数。

LinkHashSetHashSet+LinkedHashMap

对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。

LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法

操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并

通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操

作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。

二.子接口

  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只适用集合频繁迭代但很少修改的情景.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值