上一篇我们说完了List类和其一些常用的子实现类,这篇我们说下Set类和其常用的子实现类;
集合类的相关总结(一)
Set<E>类
-
特点:
- 不包含重复数据
- 最多只包含一个空元素
- 无序
- 只是个接口,本身没有实现
-
方法摘要:
- add(E e) 如果set中尚未存在指定的元素则添加次元素,返回true,反之不改变set返回false。
- addAll(Collection<? extends E> c) 如果set中没有指定collection 中的所有元素,则将其添加到此 set 中,返回true;
- clear() 清除set中的所有元素
- contains(Object o) 如果 set 包含指定的元素,则返回 true。
- containsAll(Collection<? extends E> c) 如果此 set 包含指定 collection 的所有元素,则返回 true。
- isEmpty() 如果set不包含元素,则返回ture。
- iterator() 返回返回一个迭代器
- remove(Object o) 如果 set 中存在指定的元素,则将其移除(可选操作)。
- removeAll(Collection<? extends E> c) 移除 set 中那些包含在指定 collection 中的元素(可选操作)。
- retainAll(Collection<? extends E> c) 仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
- size() 返回set中元素的数量
- toArray() 返回一个包含set中所有元素的数组
HashSet<E>类
- 概述:
此类实现不是同步的,如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改)可以在创建的时候用Collections.synchronizedList方法将对象“包装起来”。
** Set s = Collections.synchronizedSet(new HashSet(...));**
- 构造方法
- HashSet() 构造一个新的空 set。
- HashSet(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的新 set。
- HashSet(int initialCapacity) 构造一个指定容量大小的set
- HashSet(int initialCapacity, float loadFactor) 构造一个新的空 set,其底层 HashMap 实例具有指定的初始容量和指定的加载因子。
- 方法摘要:和Set<E>类的方法完全一样!
TreeSet<E>类
特点:
有顺序的set集合,并且通过比较器对指定顺序的规则
线程不同步
构造方法:
TreeSet() 构造一个新的空的set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c) 构造一个包含指定c元素的新TreeSet集合,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s) 构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
方法摘要:
add(E e) 将指定的元素添加到此 set(如果该元素尚未存在于 set 中)。
addAll(Collection<? extend E> c) 将指定 collection 中的所有元素添加到此 set 中。
clear() 移除此 set 中的所有元素。
isEmpty() 如果此 set 不包含任何元素,则返回 true。
comparator() 返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然排序,则返回null;
contains(Object o) 如果此 set 包含指定的元素,则返回 true。
descendingIterator() 返回在此 set 元素上按降序进行迭代的迭代器。
iterator() 返回在此 set 中的元素上按升序进行迭代的迭代器。
descendingSet() 返回此 set 中所包含元素的逆序视图。
first() 返回此 set 中当前第一个(最低)元素。
last() 返回此 set 中当前最后一个(最高)元素。
higher(E e) 返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null。
lower(E e) 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null。
ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null。
floor(E e) 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null。
pollFirst() 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null。
pollLast() 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。
remove(Object o) 将指定的元素从 set 中移除(如果该元素存在于此 set 中)。
size() 返回 set 中的元素数(set 的容量)。
subSet(E fromElement,E toElement) 返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。
-
subSet(E fromElement, boolean fromInclusive,E toElement, boolean toInclusive )
- fromElement - 返回 set 的低端点
- fromInclusive - 如果低端点要包含在返回的视图中,则为 true
- toElement - 返回 set 的高端点
- toInclusive - 如果高端点要包含在返回的视图中,则为 true
- 如果 fromElement 和 toElement 相等,则返回的 set 为空,除非 fromExclusive 和 toExclusive 都为 true。
tailSet(E fromElement) 返回此 set 的部分视图,其元素大于等于 fromElement。
tailSet(E fromElement, boolean inclusive) 返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement。
-
headSet(E toElement) 返回此 set 的部分视图,其元素严格小于 toElement。
- head(E toElement, boolean inclusive) 返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement。
特别注意:
- 如果set是按自然顺序进行排序的,那么set里面的元素必须实现Comparable接口,否则会报类转换异常。
- 因为set集合本身是不能含有重复的元素的,所以当进行排序的时候,要特别注意自定义的排序规则返回0的规则,不然可能造成数据的丢失,这个可以视具体需求而定。
代码展示:
- 构建自然排序的TreeSet集合
从结果可以看出,我在自定义比较规则中是按照年龄的升序进行排列的,并且可以看到结果出现了两个42岁的人,那个因为我再自定义比较规则的时候,判断当年龄相同时返回的不是0,如果是0就代表是重复数据,那么集合只会保留第一次出现该年龄的元素。例如:
- 构建带有比较器的TreeSet集合
从结果可以看出是按照字母顺序来的,而且不区分大小写。但是如果换成汉字的话,顺序好像就不管用了,所以建议还是将汉字转换为拼音进行比较好。例如:
知识扩展:Comparator类和Comparable类的简单了解
- Comparator类,俗称“比较器”,继承它之后要重写
@Override
public int compare(Object o1, Object o2) {
return 0;
}
可以看到此方法返回的是一个int类型的数据,那么怎么能够体现排序的原则呢?答案就是:
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。我们一般返回的值就是用 -1、0 或 1。
- Comparable类,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。我们一般返回的值就是用 -1、0 或 1。