HashSet特点
1,只能够存放无重复的数据;
2,只能够存放单个值数据;
HushSet使用
1,常用方法
add() 返回值为Boolean类型
size() 返回值为int类型
remove() 返回值为Boolean类型
iteratot() 返回值为iterator
contains() 返回值为boolean类型
clear()
isEmpty()
2,遍历方式
Iterator<Integer> iterator1 = hashSet.iterator();
while (iterator1.hasNext()){
System.out.print(iterator1.next()+" ");
}
HashSet的源码解读(基于jdk1.7版本)
1,继承关系
从源码中可以看出HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
2,底层数据结构
数组+链表
3,构造函数(共五个)
(1),默认的无参构造器,构造一个空的HashSet
实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75
public HashSet() {
map = new HashMap<E,Object>();
}
(2),构造一个包含指定collection中的元素的新set
collection中所有元素的初始容量来创建一个HashMap
public HashSet(Collection<? extends E> c) {
map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
(3),以指定的initialCapacity和loadFactor构造一个空的HashSet
实际底层以相应的参数构造一个空的HashMap
initialCapacity 初始容量 loadFactor 加载因子
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<E,Object>(initialCapacity, loadFactor);
}
(4),以指定的initialCapacity构造一个空的HashSet
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
(5),以指定的initialCapacity和loadFactor构造一个新的空链接哈希集合。
此构造函数为包访问权限,不对外公开,实际只是是对LinkedHashSet的支持
dummy 标记(boolean)
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
4,属性
//基于HashMap实现,底层使用HashMap保存所有元素
private transient HashMap<E,Object> map;
//定义一个Object对象作为HashMap的value
private static final Object PRESENT = new Object();
5,默认值
默认初始容量为16
加载因子0.75
6,增长方式
同HashMap一样,二倍的扩容方式
if (numKeysToBeAdded > threshold) {
int targetCapacity = (int)(numKeysToBeAdded / loadFactor + 1);
if (targetCapacity > MAXIMUM_CAPACITY)
targetCapacity = MAXIMUM_CAPACITY;
int newCapacity = table.length;
while (newCapacity < targetCapacity)
newCapacity <<= 1;
if (newCapacity > table.length)
resize(newCapacity);
}
7,CRUD(增删查改)
增:add()
删:remove();
改:先用remove()移除,再用add()添加;
查:迭代器遍历