1 前言
本人使用的是jdk1.8版本。
2 List集合继承结构
3 底层实现
HashSet底层是用一个HashMap,添加的数据存入了map的key的位置,而value则固定是PRESENT。由于HashMap中key是不能重复的(重复的话会用插入数据覆盖原数据),所以这就保证了HashSet中的元素是不重复的;而判断两个元素是否重复的方法,就是HashMap中判断key是否重复的方法,即:p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))为true,则相等,这里的p是HashMap中已存在的元素,key是我们插入的key,hash是我们插入key的hashCode值经过运算后的值。详情见:Hashmap底层实现 jdk1.8。
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable{
// 核心map容器
private transient HashMap<E,Object> map;
// map中的value
private static final Object PRESENT = new Object();
......
}
4 add()和remove()
HashSet中的add和remove方法都是调用的HashMap中的put和remove方法。HashSet没有get方法,想要获取某个元素,只能通过HashMap的keySet()方法进行遍历比较来获取,HashSet中的Iterator()就提供了这样的功能。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
5 Iterator()
HashSet的Iterator()其实就是调用HashMap的keySet().Iterator(),对HashMap的key集合进行遍历,这个迭代器是HashMap的内部类,详情参考:Hashmap底层实现 jdk1.8。
public Iterator<E> iterator() {
return map.keySet().iterator();
}