Java-第十五部分-源码解读-HashSet、LinedHashSet和TreeSet

141 阅读1分钟

源码解读全文

HashSet

  • Val放在MapKey

构造

  • 底层是放在HashMap里的
private transient HashMap<E,Object> map;
public HashSet() {
    map = new HashMap<>();
}
  • 带参构造,调用HashMap
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

add

  • 调用mapput方法
public boolean add(E e) {
    //如果存在就返回false
    return map.put(e, PRESENT)==null;
}
  • value为固定的
private static final Object PRESENT = new Object();

remove

  • 同样调用mapremove方法
public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

LinkedHashSet

  • 底层调用LinkedHashMap

构造

  • 实际通过这个构造初始化一个LinkedHashMap
public LinkedHashSet() {
    super(16, .75f, true);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

TreeSet

构造

  • 内部调用了TreeMap
//接口类,TreeMap也继承了该类
private transient NavigableMap<E,Object> m;
public TreeSet() {
    this(new TreeMap<E,Object>());
}

TreeSet(NavigableMap<E,Object> m) {
    this.m = m;
}

put

  • 功能方法
public boolean add(E e) {
    return m.put(e, PRESENT)==null;
}

小结

  • set其实就是内部组合map
  • key为值,valueObject对象