HashSet详解

介绍

  1. 基于HashMap保存元素不保证有序,不包含重复元素,允许null值.主要继承关系如图:

    1
    2
    3
    4
    5
    6
    
    graph BT
    HashSet-->AbstractSet
    HashSet-.->Set
    AbstractSet-.->Set
    AbstractSet-->AbstractCollection
    AbstractCollection-.->Collection	

参数

1
2
3
4
5
6
7
static final long serialVersionUID = -5024744406713321676L;

//底层存储用的hashMap
private transient HashMap<E,Object> map;

//定义一个Object对象作为HashMap的value
private static final Object PRESENT = new Object();

常用方法

由于底层是hashmap存储的,所以基本是一样的.没什么区别.实现不重复插入是通过比较put操作的返回值是不是null

 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
37
38
public Iterator<E> iterator() {
    return map.keySet().iterator();
}

public int size() {
    return map.size();
}

public boolean isEmpty() {
    return map.isEmpty();
}

public boolean contains(Object o) {
    return map.containsKey(o);
}

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

public void clear() {
    map.clear();
}

@SuppressWarnings("unchecked")
public Object clone() {
    try {
        HashSet<E> newSet = (HashSet<E>) super.clone();
        newSet.map = (HashMap<E, Object>) map.clone();
        return newSet;
    } catch (CloneNotSupportedException e) {
        throw new InternalError(e);
    }
}