1.java集合框架图
2.所属包
package java.util;
3.继承与实现关系
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
4.准备工作
类HashSet实际上是操作一个HashMap的实例,不保证集合的迭代顺序,也不保证该顺序恒久不变,该类允许使用null元素。建议先看HashMap的源码解析 : java集合之HashMap源码解析
5.属性
//由哈希表(实际上是一个 HashMap 实例)支持。
private transient HashMap<E,Object> map;
/*由于HashSet是对单值操作,而HashMap采用的是键值对的形式,由于HashSet的元素值作为了HashMap的键,那么对应的值就都是PRESENT。
*满足HashMap结构
*/
private static final Object PRESENT = new Object();
6.构造方法
/** 构造方法1:
* 构造一个初始化容量为16,加载因子为0.75的HashMap
*/
public HashSet() {
map = new HashMap<>();
}
/** 构造方法2:
* 采用HashMap的集合参数为构造方法的参数的方式
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
/** 构造方法3:
* 输入一个初始化容量和加载因子的构造方法HashMap
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
/** 构造方法4:
* 输入初始化容量的构造方法HashMap
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
7.方法
add方法:
/**
* 采用HashMap的put方法,如果添加的元素已经存在于HashMap中,那么就返回true,否则返回false
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
remove方法:
/**
* 采用HashMap中的remove方法,在HashMap中删除键对应的值就返回对应的Entry元素的值,将值与存入的PRESENT值比较。
* 如果值相同就删除成功,否则失败
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
-----------------------------该源码为jdk1.7版本的