前言
HashSet
其实实现很简单,也很取巧。
底层结构
1 2 3 4 5 6
| private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); }
|
看构造函数就知道里面存了一个HashMap
,而那个PRESENT
的Object
的作用就是给每个存进Set
的对象的value。
基本方法
1 2 3 4 5 6 7 8 9 10 11 12
| public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } public boolean contains(Object o) { return map.containsKey(o); } public Iterator<E> iterator() { return map.keySet().iterator(); }
|
这三个基本方法可以看出,其实HashSet
就是封装了一个HashMap
,每次存一个对象其实就是在Map
中放了一个key -> Object
, 那个Object
是共享的。
而iterator方法返回的是keySet
的iterator
。