Set中不包含相同元素。其中“相同”是通过equals()进行判断的。
HashSet内部持有一个HashMap对象,对数据进行的操作(add(E):boolean、remove(Object):boolean、size():int)都是对内部的HashMap进行操作。所以,HashSet本质上相当于一个HashMap。
继承于HashSet
只是实现了几个构造方法,并且这几个构造方法都是直接使用了父类的构造方法。
LinkedHashSet所使用的父类构造方法:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}HashSet其他的构造方法:
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}只有在HashSet的这个构造方法中,把map实例化LinkedHashMap,而其他的构造方法则是把map实例化为HashMap。所以LinkedHashSet的实现是通过LinkedHashMap实现的。
注意: 无论是HashSet还是LinkedHashSet,它们本质上是一个值(Value)为同一Object(即是源码中的PRESENT)的Map。
实现了NavigableSet接口
NavigableSet接口提供了一系列导航方法,例如:
- lower(E):E
- floor(E):E
- ceiling(E):E
- higher(E):E
- ...
TreeSet内部持有一个NavigableMap引用,然后在TreeSet的构造方法中将该引用实例化为一个TreeMap对象。和HashSet类似,对HashSet的相关操作基本上都是通过执行TreeMap的相关方法实现的。
-
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放 -
LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代 -
TreeSet:提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快