Set集合

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

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

一、 HashSet类
HashSet类是Set接口的典型实现类,大多数时候使用Set集合时就是使用这个实现类。 HashSet类 按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。

HashSet类具有以下特点:
① 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
② HashSet不是同步的(不是线程安全的),如果多个线程同时访问一个 HashSet,假设有两个或者 两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
③ 集合元素值可以是null,但只能放入一个null。
HashSet判断元素是否相等的依据:hashCode()相同,equals()方法相同;

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

三、 TreeSet类
TreeSet是 SortedSet接口的实现类,正如 SortedSet名字所暗示的, TreeSet可以确保集合元素处 于排序状态。与 Set集合相比,TreeSet还提供了如下几个额外的方法。
1、 comparator() 返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null。
2、 first() 返回此 set 中当前第一个(最低)元素。
3、 floor(E e) 返回此 set 中小于等于给定元素的最大元素;如果不存 在这样的元素,则返回 null。
4、 lower(E e) 返回此 set 中严格小于给定元素的最大元素;如果不存 在这样的元素,则返回 null。
5、 higher(E e) 返回此 set 中严格大于给定元素的最小元素;如果不存 在这样的元素,则返回 null。
6、 ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存 在这样的元素,则返回 null。
7、 last() 返回此 set 中当前最后一个(最高)元素。
8、 headSet(E toElement) 返回此 set 的部分视图,其元素严格小于 toElement。
9、 tailSet(E fromElement) 返回此 set 的部分视图,其元素大于等于 fromElement。
10、 subSet(E fromElement, E toElement) 返回此 set 的部分视图,其元素从 fromElement(包 括)到 toElement(不包括)。

由于TreeSet是有序的,也支持Comparable和Comparator两种排序方式

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值