(源码分析)HashSet源码分析
程序员文章站
2022-07-15 20:38:08
...
目录
说明:当前HashSet的版本为JDK1.8.0_144
成员变量
private transient HashMap<E,Object> map; // HashSet底层是以HashMap来储存数据的,key为add()中的元素,value为PRESENT值
private static final Object PRESENT = new Object(); // 空的Object对象,作为HashMap中的value值
构造方法
HashSet():无参构造
/**
* 使用默认初始化容量16和默认的加载因子0.75,初始化HashMap
*/
public HashSet() {
map = new HashMap<>();
}
HashSet(int initialCapacity):指定初始化容量
/**
* 使用指定的初始化容量initialCapacity和默认的加载因子0.75,初始化HashMap
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor):指定初始化容量和加载因子
/**
* 使用指定的初始化容量initialCapacity和指定的加载因子loadFactor,初始化HashMap
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
HashSet(Collection<? extends E> c):在初始化时构造一组包含指定集合中的元素的HashSet对象
/**
* 在初始化HashMap时添加一个集合
*/
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
/**
* 向HashMap中添加一个集合
*/
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
/**
* 向HashMap中添加元素
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
成员方法
add(E e)
add(E e)执行原理:
1、调用HashMap中的put方法进行添加元素
add(E e)源码:
/**
* 向HashMap中添加元素
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
remove(Object o)
remove(Object o)执行原理:
1、调用HashMap中的remove方法进行添加元素
remove(Object o)源码:
/**
* 移除HashMap中的元素
*/
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
contains(Object o)
contains(Object o)执行原理:
1、调用HashMap中的containKey方法进行添加元素
contains(Object o)源码:
/**
* 判断HashMap中是否存在指定元素
*/
public boolean contains(Object o) {
return map.containsKey(o);
}
clear()
clear()执行原理:
1、调用HashMap中的clear方法进行添加元素
clear()源码:
/**
* 将HashMap中的元素清空
*/
public void clear() {
map.clear();
}
isEmpty()
isEmpty()执行原理:
1、调用HashMap中的isEmpty方法进行添加元素
isEmpty()源码:
/**
* 判断HashMap中的元素个数是否为0
*/
public boolean isEmpty() {
return map.isEmpty();
}
clone()
clone()执行原理:
1、浅克隆一个HashSet集合
clone()源码:
/**
* 克隆
*/
public Object clone() {
try {
HashSet<E> newSet = (HashSet<E>) super.clone();
newSet.map = (HashMap<E, Object>) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
size()
size()执行原理:
1、调用HashMap中的size方法进行添加元素
size()源码:
/**
* 返回HashMap中的元素个数
*/
public int size() {
return map.size();
}
iterator()
iterator()执行原理:
1、返回HashMap中内部类KeyIterator中的iterator()方法
iterator()源码:
/**
* 返回HashMap中内部类KeyIterator中的iterator()方法
*/
public Iterator<E> iterator() {
return map.keySet().iterator();
}
spliterator()
spliterator()执行原理:
1、返回HashMap中内部类KeySpliterator实例
spliterator()源码:
/**
* 返回HashMap中内部类KeySpliterator实例
*/
public Spliterator<E> spliterator() {
return new HashMap.KeySpliterator<E,Object>(map, 0, -1, 0, 0);
}
总结
- HashSet底层是使用HashMap来存储数据,key值为HashSet中的数据,value值为一个空的Object对象
- HashSet的方法都是通过调用HashMap中的方法来实现的
上一篇: ES5的继承