基于JDK7
一、概述
HashSet 是一个没有重复元素的集合。底层是由HashMap实现的,不保证元素的顺序。HashSet允许使用 null 元素。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
HashSet继承了AbstractSet类,实现了Set、Cloneable、Serializable接口。
AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。Set接口是一种不包括重复元素的Collection。
基本属性
//底层就是由hashmap实现,hashmap的 key 座位set的值,value为一个常量object
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
构造函数
//初始化一个空的HashMap,默认初始容量为16和加载因子0.75。
public HashSet() {
map = new HashMap<>();
}
//构造一个包含指定 collection 中的元素的新set,初始容量为max(16, collection.size()/0.75+1)
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);
}
二、API
HashSet是非同步的。如果多个线程同时访问一个HashSet,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问:
Set s = Collections.synchronizedSet(new HashSet(...));
由于HashSet而言,其方法的实现过程是非常简单的。
主要API
boolean add(E object)
void clear()
Object clone()
boolean contains(Object object)
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object object)
int size()
三、遍历方式
3.1 iterator遍历
(1)根据iterator()获取HashSet的迭代器。
(2)遍历迭代器获取各个元素。
for(Iterator iterator = set.iterator();iterator.hasNext();) {
iterator.next();
}
3.2 for-each遍历
(1)根据API的 toArray() 接口获取 HashSet的元素集合对应的数组。
(2)遍历数组,获取各个元素。
// T 为元素类型 即泛型
T[] arr = (T[])set.toArray(new T[0]);
for (T str:arr)
3.3 demo
学习/参考
http://cmsblogs.com/?p=599
https://www.cnblogs.com/skywang12345/p/3311252.html