1. 程式人生 > >Set的原始碼分析

Set的原始碼分析

Set的內部實現其實是一個Map。即HashSet的內部實現是一個HashMap,TreeSet的內部實現是一個TreeMap,LinkedHashSet的內部實現是一個LinkedHashMap。

public HashSet() {
  map = new HashMap<>();
}
HashSet(
int initialCapacity, float loadFactor, boolean dummy) {   map = new LinkedHashMap<>(initialCapacity, loadFactor); }
public TreeSet() {
  this(new TreeMap<E,Object>()); }
public LinkedHashSet() {
  super(16, .75f, true);
}

但是,存到Set中只有一個元素,又是怎麼變成(key,value)的呢?

以HashSet為例

private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
public Iterator<E> iterator() {
    
return map.keySet().iterator(); }

原來是,把新增到Set中的元素作為內部實現mapkey,然後用一個常量物件PRESENT物件,作為value

這是因為Set的元素不可重複和Mapkey不可重複有相同特點。Map有一個方法keySet()可以返回所有key

public HashSet() {

        map = new HashMap<>();

}

    HashSet(intinitialCapacity, float

loadFactor, booleandummy) {

        map = new LinkedHashMap<>(initialCapacity, loadFactor);

    }