容器(四)Set
public interface Set<E>
extends Collection<E> {
...
}
HashSet
属于抽象数据结构,通过 HashMap 实现。
继承关系
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}
底层数据结构
private static final Object PRESENT = new Object(); // 伪值,填充 Map 的 value private transient HashMap<E,Object> map; // 底层 HashMap
public HashSet() {
map = new HashMap<>();
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
操作-增删改查遍历
- 增 改
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
- 删
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
- 查
public boolean contains(Object o) {
return map.containsKey(o);
}
- 遍历
public Iterator<E> iterator() {
return map.keySet().iterator();
}
其他
- 容量、线程安全、及其他特征同 HashMap 。
LinkedHashSet
属于抽象数据结构,通过继承 HashSet 由 LinkedHashMap 实现。
继承关系
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
}
底层数据结构
public LinkedHashSet() {
super(16, .75f, true);
}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
操作-增删改查遍历
- 最终由 LinkedHashMap 来实现增删查改。
其他
- 容量、线程安全、及其他特征同 LinkedHashMap 。
TreeSet
属于抽象数据结构,由 TreeMap 实现。
继承关系
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable {
...
}
底层数据结构
private static final Object PRESENT = new Object(); // 伪值,用于填充 Map 的 value
private transient NavigableMap<E,Object> m;
public TreeSet() {
this(new TreeMap<E,Object>());
}
public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
操作-增删改查遍历
- 最终由 TreeMap 来实现增删查改。
其他
- 容量、线程安全、及其他特征同 TreeMap 。