set集合

					Set集合

Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的
添加顺序。
Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失
败,add()方法返回 false,且新元素不会被加入。

Set常用方法
boolean add(E e) 如果 set 中尚未存在指定的元素,则添加此元素。
boolean addAll(Collection c) 如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中。void clear() 移除此 set 中的所有元素。
boolean contains(Object o) 如果 set 包含指定的元素,则返回 true。
boolean containsAll(Collectionc)如果此 set 包含指定 collection 的所有元素,则返回true。
boolean equals(Object o) 比较指定对象与此 set 的相等性。
boolean isEmpty() 如果 set 不包含元素,则返回 true。
Iterator iterator() 返回在此 set 中的元素上进行迭代的迭代器。
boolean remove(Object o) 如果 set 中存在指定的元素,则将其移除。
boolean removeAll(Collectionc)移除 set 中那些包含在指定 collection 中的元素。
boolean retainAll(Collection c) 仅保留 set 中那些包含在指定 collection 中的元素。
int size() 返回 set 中的元素数(其容量)。Object[] toArray() 返回一个包含 set 中所有元素的数组。T[] toArray(T[] a)返回一个包含此 set 中所有元素组返回数组的运行时类型是指定数组的类型。

一、HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。 HashSet类 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet类具有以下特点:
不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者
两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
集合元素值可以是null,但只能放入一个null。
当向 HashSet集合中存入一个元素时, HashSet会调用该对象的 hashCode()方法来得到该对象的
hashCode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。如果有两个元素通过
equals方法比较返回true,但它们的hashCode()方法返回值不相等, HashSet将会把它们存储在
不同的位置,依然可以添加成功。
HashSet判断元素是否相等的依据:hashCode()相同,equals()方法相同;

二、LinkedHashSet类
HashSet类还有一个子类 LinkedHashSet, LinkedHashSet集合也是根据元素的 hashCode值来决
定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。
也就是说,当遍历 LinkedhashSet集合里的元素时, LinkedHashSet将会按元素的添加顺序来访问集合
里的元素。
LinkedHashSet需要维护元素的插入顺序,因此性能略低于 HashSet的性能,但在迭代访问Set里的
全部元素时将有很好的性能,因为它以链表来维护内部顺序
由于TreeSet是有序的,也支持Comparable和Comparator两种排序方式

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

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

Set的实现类HashSet、TreeSet都是线程不安全的。如果有多个线程同时访问一个Set集合,并且有
超过一个线程修改了该Set集合,则必须手动保证该Set集合的同步性。通常可以通过Collections工具类
的synchronizedSortedSet方法来“包装”该Set集合。

Queue 队列
【Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构】
【Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口】

boolean add(E e)将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出
IllegalStateException。 E element() 获取,但是不移除此队列的头。
boolean offer(E e) 将指定的元素插入此队列(如果立即可行且不会违反容量限制)
E peek() 获取但不移除此队列的头;如果此队列为空,则返回 null。 E poll() 获取并移除此队列的头,如果此队列为空,则返回 null。 E remove() 获取并移除此队列的头。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值