HashSet概述
1.HashSet底层基于HashMap
2.HashSet存放的元素无序不重复
3.HashSet继承AbstractSet类,实现了set,Cloneable,java.io.Serializable接口
4.HashSet线程不安全
类图:
HashSet源码解读
1.HashSet成员变量
HashSet直接使用HashMap存放数据,因HashMap的Key必须唯一,所以可以将我们需要存放的数据放到Key保证不重复,而所有的value对应一个内部的对象PRESENT
// 实际存放数据的hashmap
private transient HashMap<E,Object> map;
// hashmap的value值
private static final Object PRESENT = new Object();
2.HashSet构造器
(1)无参构造器
// 无参构造器
public HashSet() {
map = new HashMap<>();
}
(2)指定一个集合的构造器
// 指定一个集合的有参构造器
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
(3)指定容量和加载因子的构造器
// 指定容量和加载因子的构造器
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
(4)指定初始容量的构造器
// 创建initialCapacity大小的HashSet
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
3.添加一个元素add()方法
■ 往HashSet中添加元素,就是添加一个HashMap存放对应key,value
■ HashMap中的key实际就是要添加的元素,value对应一个内部的对象PRESENT
■ HashMap中的key不能重复,因此HashSet元素不重复
■ HashMap第一次添加成功会返回null,再次插入同样key的元素,会用新的value替换原来的旧的value,并且返回旧的value
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
4.移除一个元素remove()
■ HashSet删除元素,调用的HashMap的remove()方法
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
5.迭代器取得元素
■ HashSet没有get方法,采用迭代器遍历获取
public Iterator<E> iterator() {
return map.keySet().iterator();
}
6.判断是否包含某个元素
■ 用HashMap的containsKey(key)方法判断
public boolean contains(Object o) {
return map.containsKey(o);
}
总结
■ HashSet底层是HashMap,HashMap的key存放元素,value存放内部的对象PRESENT
■ HashSet以HashMap不能存储重复的Key来实现元素不重复
■ HashSet以HashMap的key是基于hashcode存储来保证无序
■ HashSet线程不安全