简介
基于HashMap的Set接口实现。它不保证集合的迭代顺序。特别是,它不能保证顺序会随着时间的推移保持恒定,当扩容时顺序将调整。此类允许null元素。
类继承关系
属性
1 2 3 4 5 6
| 1 -- 创建的HashMap
2 private transient HashMap<E,Object> map;
3 -- 因为底层使用HashMap实现,要存key,value,这个固定值就是所有数据的value了
4 private static final Object PRESENT = new Object();
5
6 |
构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 1-- 这里构造方法是创建了一个HashMap
2public HashSet() {
3 map = new HashMap<>();
4}
5public HashSet(int initialCapacity, float loadFactor) {
6 map = new HashMap<>(initialCapacity, loadFactor);
7}
8public HashSet(int initialCapacity) {
9 map = new HashMap<>(initialCapacity);
10}
11public HashSet(Collection<? extends E> c) {
12 map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
13 addAll(c);
14}
15-- 给LinkedHashSet使用
16HashSet(int initialCapacity, float loadFactor, boolean dummy) {
17 map = new LinkedHashMap<>(initialCapacity, loadFactor);
18}
19
20 |
方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| 1-- 添加 调用map的put方法
2public boolean add(E e) {
3 return map.put(e, PRESENT)==null;
4}
5public boolean remove(Object o) {
6 return map.remove(o)==PRESENT;
7}
8public void clear() {
9map.clear();
10}
11public boolean isEmpty() {
12 return map.isEmpty();
13}
14public int size() {
15 return map.size();
16}
17-- hashset没有提供get方法
18public boolean contains(Object o) {
19 return map.containsKey(o);
20}
21-- 调用map的keyset迭代 更像是hashmap留下的钩子
22public Iterator<E> iterator() {
23 return map.keySet().iterator();
24}
25-- 重写克隆方法 实现深拷贝
26public Object clone() {
27 try {
28 HashSet<E> newSet = (HashSet<E>) super.clone();
29 newSet.map = (HashMap<E, Object>) map.clone();
30 return newSet;
31 } catch (CloneNotSupportedException e) {
32 throw new InternalError(e);
33 }
34}
35
36 |
总结
内部使用HashMap的key存储元素,来保证数据不重复
线程不安全
无序
允许key为null
没有get方法
支持快速失败