Set
HashSet
类继承
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{}
- 和 ArrayList 和 LinkedList 一样实现了 Cloneable、Serializable
- Set:定义了一些公共的方法,比如
add、contains、remove、clear等方法
Set 实现了 Collestion 接口,所以 HashSet 具有集合的一些特性 - AbstractSet:实现了一些统一的方法,避免子类中重复编码,
equals、hashCode、removeAll
类成员
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
// 构造方法,创建了一个 HashMap
public HashSet() {
map = new HashMap<>();
}
// 这个构造方法是提供给 LinkedHashSet 初始化的
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 int size() {
return map.size();
}
HashSet 没什么好说的,底层就是靠 HashMap 实现的
- 移除元素就是从 Map 移除元素
- 添加元素也是加入到 Map 里,key 是元素,value 是默认对象
LinkedHashSet
HashSet 和 LinkedHashSet 区别就是 HashMap 和 LinkedHashMap 的区别
所以 LinkedHashSet 也是有顺序的,底层数据结构是哈希表+双向链表
构造方法:
public LinkedHashSet() {
super(16, .75f, true);
}
创建 LinkedHashSet 时,会调用父类 HashSet 的方法来创建:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor); // 创建了一个 LinkedHashMap
}
TreeSet
TreeSet 是靠 TreeMap 实现的,所以底层数据结构也是 红黑树
public TreeSet() {
this(new TreeMap<E,Object>());
}

浙公网安备 33010602011771号