Java集合(八):Set

Catalogue
  1. 1 构造方法
  2. 2 add(E e)

注意
本系列文章是笔者在参考了大量优秀文章的基础上的理解,由于水平有限,难免会出现错误,望批评指正,同时我也会把自己最新的理解及时更新到文章中去。最后,我会在文中注明参考文章,特别感谢这些无私奉献的作者。

理解完之前几篇关于 Java 集合的文章后,对于 Set 的理解就非常容易了。Set 是用于存储不重复元素的集合,常见的 Set 类集合由如下几种:

1、HashSet

2、TreeSet

3、LinkedHashSet

4、CopyOnWriteSet

前三种 Set 都是对各自对应的 Map 的封装,并以 key 为操作对象。

CopyOnWriteArraySet 则是对 CopyOnWriteArrayList 的封装,利用了 CopyOnWriteArrayList addIfAbsent 方法不重复添加元素的特性。

下面只以 HashSet 为例讲解,其它几个实现方式类似。

1 构造方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public HashSet() {
map = new HashMap<>();
}

public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}

public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}

前三个方法都是内部创建了一个 HashMap 对象,第四个方法创建的是 LinkedHashMap 对象,我想是为了方便 HashSet 拥有 LinkedHashSet 的能力而增加的构造方法吧。

2 add(E e)

1
2
3
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}

添加方法实际调用了 HashMap 的 put 方法,给它的 value 传入固定对象 PRESENT。这样就通过 HashMap 保证了传入值的唯一性(PS:其它的方法实现方式类似,自行去看源码吧)。

看完上面内容后,建议再看一下下面这篇文章,以加深对 Set 的理解.

点击跳转>>