Set的原始碼分析
阿新 • • 發佈:2018-12-18
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中的元素作為內部實現map的key,然後用一個常量物件PRESENT物件,作為value。
這是因為Set的元素不可重複和Map的key不可重複有相同特點。Map有一個方法keySet()可以返回所有key。
public HashSet() {
map = new HashMap<>();
}
HashSet(intinitialCapacity, float loadFactor, booleandummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}