接上一篇文章《java8 常用集合类汇总详解之List》,本文介绍集合Set。
Set的实现类主要是HashSet、TreeSet、LinkedHashSet、CopyOnWriteArraySet。
Set有一个最大的特点就是没有重复元素。 因此可以使用Set去重。
Set接口没有提供像List.get()一样直接获得某个指定元素的方法,不过它提供遍历所有元素的方法。
1、HashSet
HashSet其实是基于HashMap实现的,下面是该类的构造方法:
public HashSet() {
map = new HashMap<>();
}
该类的所有操作都委托给HashMap完成。
HashMap的key记录HashSet的元素,value都是Object对象。下面是属性map和Object对象的定义:
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
下面是add方法新增一个元素,可以看到value永远都是PRESENT:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
2、TreeSet
TreeSet也是基于TreeMap实现的,该类的所有操作都委托给TreeMap完成,也是使用TreeMap的key记录TreeSet的元素,value都是Object对象。
3、LinkedHashSet
LinkedHashSet是HashSet的子类,LinkedHashSet基于LinkedHashMap实现,该类的所有操作都委托给LinkedHashMap完成。
如果不指定初始容量,默认初始容量为16。
前面三个类都是基于Map实现的,因为Map的key天然具有不重复的特性,因此可以保证集合中元素不相等。
4、CopyOnWriteArraySet
CopyOnWriteArraySet内部使用CopyOnWriteArrayList存储元素,其所有的操作也是委托给CopyOnWriteArrayList完成,基本都是调用CopyOnWriteArrayList中的同名方法。
CopyOnWriteArrayList可以参见文章《java8 常用集合类汇总详解之List》。
private final CopyOnWriteArrayList<E> al;
/**
* Creates an empty set.
*/
public CopyOnWriteArraySet() {
al = new CopyOnWriteArrayList<E>();
}
向CopyOnWriteArraySet中插入元素前,会先比较集合中当前已有的元素,如果有相等的元素,则不插入。