Set
内部元素 无序的,不可重复元素的 collection
API:
boolean | add(E e) 如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。 | |
boolean | addAll(Collection<? extends E> c) 如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。 | |
void | clear() 移除此 set 中的所有元素(可选操作)。 | |
boolean | contains(Object o) 如果 set 包含指定的元素,则返回 true。 | |
boolean | containsAll(Collection<?> c) 如果此 set 包含指定 collection 的所有元素,则返回 true。 | |
boolean | equals(Object o) 比较指定对象与此 set 的相等性。 | |
int | hashCode() 返回 set 的哈希码值。 | |
boolean | isEmpty() 如果 set 不包含元素,则返回 true。 | |
Iterator<E> | iterator() 返回在此 set 中的元素上进行迭代的迭代器。 | |
boolean | remove(Object o) 如果 set 中存在指定的元素,则将其移除(可选操作)。 | |
boolean | removeAll(Collection<?> c) 移除 set 中那些包含在指定 collection 中的元素(可选操作)。 | |
boolean | retainAll(Collection<?> c) 仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。 | |
int | size() 返回 set 中的元素数(其容量)。 | |
Object[] | toArray() 返回一个包含 set 中所有元素的数组。 | |
|
|
Set 的选择:
不包含重复元素
单线程下:
仅需要不包含重复元素就用HashSet,
需要按添加时顺序遍历就用LinkedHashSet、
需要进行元素的大小排序就用TreeSet、
仅可以包含一个枚举类型的所有实例,就用EnumSet.
多线程下:
需要不包含重复元素且
需要进行key的大小排序就用ConcurrentSkipListSet
在读取操作远过多大于写入删除操作时就用CopyOnWriteArraySet
也可以使用Collections.synchronizedSet(Set<T>s)对任何一个非线程安全的Set进行包装而达到线程安全的目的,但迭代时必须同步迭代器,多线程频繁该问时,性能没有优势。
HashSet (内部由HashMap的 key 实现)
1 元素读取无顺序
2.允许添加一个null元素
3.插入删除速度快
4.重复的判断条件:equals及hashCode 都相等
5.非线程安全
6.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException(Iterator.remove除外)
7.添加可变元素后,元素变化导至hashcode变化,将不能再定位到该元素
LinkedHashSet (内部由LinkedHashMap的KEY相关功能实现)
1.可按插入顺序读取
2.允许添加一个null元素
3.顺序读取速度快
4.重复的判断条件:equals及hashCode 都相等
5.非线程安全
6.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException(Iterator.remove除外)
7.添加可变元素后,元素变化导至hashcode变化,将不能再定位到该元素
TreeSet(内部由TreeMap的KEY相关功能实现)
1.可按顺序读取。内部使用key实现的Comparable接口或 指定的Comparator接口 来进行比较再排序。
2.允许添加一个null元素
3..重复的判断条件: e.compareTo(Set里的元素)==0 或 Comparator.compare(e,Set里的元素)==0
4.非线程安全
5.创建Iterator后,对Set的修改,Iterator会报错:ConcurrentModificationException
TreeSet 实现了NavigableSet 接口:
E | ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null 。 |
Iterator<E> | descendingIterator() 以降序返回在此 set 的元素上进行迭代的迭代器。 |
NavigableSet<E> | descendingSet() 返回此 set 中所包含元素的逆序视图。 |
E | floor(E e) 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null 。 |
SortedSet<E> | headSet(E toElement) 返回此 set 的部分视图,其元素严格小于 toElement。 |
NavigableSet<E> | headSet(E toElement, boolean inclusive) 返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement 。 |
E | higher(E e) 返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null 。 |
Iterator<E> | iterator() 以升序返回在此 set 的元素上进行迭代的迭代器。 |
E | lower(E e) 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null 。 |
E | pollFirst() 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null 。 |
E | pollLast() 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null 。 |
NavigableSet<E> | subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 返回此 set 的部分视图,其元素范围从 fromElement 到 toElement 。 |
SortedSet<E> | subSet(E fromElement, E toElement) 返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。 |
SortedSet<E> | tailSet(E fromElement) 返回此 set 的部分视图,其元素大于等于 fromElement。 |
NavigableSet<E> | tailSet(E fromElement, boolean inclusive) 返回此 set 的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement 。 |
EnumSet (内部使用EnumMap)
只能保存枚举类型的Set,并且Set里的元素只能属于同一个枚举类型。
EnumSet是抽象类,不能实例化,它的子类实现了Set接口。
EnumSet提供了静态方法,选择合适的子类来实例化而生成Set对象:
static
| allOf(Class<E> elementType) 创建一个包含指定元素类型的所有元素的枚举 set。 | |
EnumSet<E> | clone() 返回 set 的副本。 | |
static
| complementOf(EnumSet<E> s) 创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含指定 set 中所不 包含的此类型的所有元素。 | |
static
| copyOf(Collection<E> c) 创建一个从指定 collection 初始化的枚举 set。 | |
static
| copyOf(EnumSet<E> s) 创建一个其元素类型与指定枚举 set 相同的枚举 set,最初包含相同的元素(如果有的话)。 | |
static
| noneOf(Class<E> elementType) 创建一个具有指定元素类型的空枚举 set。 | |
static
| of(E e) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E first, E... rest) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3, E e4) 创建一个最初包含指定元素的枚举 set。 | |
static
| of(E e1, E e2, E e3, E e4, E e5) 创建一个最初包含指定元素的枚举 set。 | |
static
| range(E from, E to) 创建一个最初包含由两个指定端点所定义范围内的所有元素的枚举 set。 |
1.可按顺序读取。枚举实例的声明顺序
2.不允许添加null元素及其它枚举类型实例
3..重复的判断条件:e.ordinal() ==Set里的元素.ordinal()
4.非线程安全
ConcurrentSkipListSet:(内部由ConcurrentSkipListMap实现)
与TreeSet类似,多了线程安全特点。
1.可按顺序读取。内部使用 元素实现的Comparable接口或 指定的Comparator接口 来进行比较再排序。
2.不允许添加一个null元素
3..重复的判断条件: e.compareTo(Set里的元素)==0 或 Comparator.compare(e,Set里的元素)==0
4.线程安全的
CopyOnWriteArraySet:(内部使用CopyOnWriteArrayList实现)
1.可按插入顺序读取。
2.允许添加一个null元素
3..重复的判断条件:o1 == null ? o2 == null : o1.equals(o2)
4.线程安全的,内部使用数组保存元素,当写时 新建数据并赋给原数组引用,即丢弃原数组对象。