前言
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。