HashSet概述
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成,其实看过了HashMap源码的同学,就会发现HashSet的实现好简单,如果没有看过关于HashMap的源码解析的,可以看我的另一篇博客:
HashSet特点
非线程安全允许null值添加值得时候会先获取对象的hashCode方法,如果hashCode 方法返回的值一致,则再调用equals方法判断是否一致,如果不一致才add元素。注意: 对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。
HashSet源码
hashset就一个重要的成员变量:
// 真正实现存储功能的map , HashSet的值就是存到HashMap的key中,所以不可重复
private transient HashMap<E,Object> map;
// HashMap的value, 一个虚拟值,无用
private static final Object PRESENT = new Object();
//构造函数
public HashSet() {
map = new HashMap<>();
}
add源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
将元素存到内部HashMap的key中,而值就是一个空的Object对象。所以HashSet特点是不可重复。
remove源码:
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
同add方法,不必讲。类似的还有下面:
public Iterator<E> iterator() {
return map.keySet().iterator();
}
public int size() {
return map.size();
}
public boolean isEmpty() {
return map.isEmpty();
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END