Set
set是一个不包含重复元素的collection。更正式的说,set不包含满足e1.equals(e2)的元素e1和e2,并且最多包哈一个null元素。
需要注意的是如果把一个可变对象置于一个set中,随着可变对象的变化,可能导致set中存在有两个相同的对象(如:2个WeakHashMap对象,随着时间推移都会变为空对象),这样就违反了set的初始定义。所以我们至少是不允许一个set作为另外一个set的元素的。
AbstractSet
是set的骨干实现类,实现了equals、hashCode和removeAll方法。
HashSet
由哈希表(HashMap)支持。它不保证集合的迭代顺序;特别是它不保证该顺序永恒不变。此类允许使用努力了元素。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
可见,在处理是所有的元素保存在hashMap的key上,同时利用了hashMap中key不可重复的特性。 PRESENT是一个final的空对象。
有一个包权限的构造器
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
在HashSet中未使用,但是这个构造器是为了LinkedHashSet提供的。
LinkedHashSet
继承HashSet,利用LinkedHashMap提供的key的双链表,来保证key的顺序。从而保证了set元素的顺序。
SortSet
该set声明了一个比较器,为元素排序提供支持。并提供了几个常用的排序方法。如:最大的、最小的、或是大于或小于某个元素。
navigableSet
在java6以后新增了这个接口,字面意思为导航set。在SortSet的基础上进一步封装了一些常用的方法。有比较大小的,有返回最大、最小值的等。
TreeSet
实现了NavigableSet接口。并采用TreeMap来实现其数据结构。保证了元素按照比较器比较顺序来排列。
EnumSet
与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。枚举 set 在内部表示为位向量。此表示形式非常紧凑且高效。此类的空间和时间性能应该很好,足以用作传统上基于 int 的“位标志”的替换形式,具有高品质、类型安全的优势。如果指定的 collection 也是一个枚举 set,则批量操作(如 containsAll 和 retainAll)也应运行得非常快。
采用
final Enum[] universe;
的数据结构。
RegularEnumSet
EnumSet的具体实现类,主要为元素不大于64的枚举服务。提供常见的Set方法。
JumboEnumSet
EnumSet的具体实现类,主要为元素大于64的枚举服务。提供常见的Set方法。