Set

HashSet

类继承

public class HashSet<E> extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{}
  1. 和 ArrayList 和 LinkedList 一样实现了 Cloneable、Serializable
  2. Set:定义了一些公共的方法,比如 addcontainsremoveclear 等方法
    Set 实现了 Collestion 接口,所以 HashSet 具有集合的一些特性
  3. AbstractSet:实现了一些统一的方法,避免子类中重复编码,equalshashCoderemoveAll

类成员

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 实现的

  1. 移除元素就是从 Map 移除元素
  2. 添加元素也是加入到 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>());
}
posted @ 2023-05-24 17:07  CyrusHuang  阅读(216)  评论(0)    收藏  举报