详解Java集合中的HashSet
简述
在写HashMap的时候提到过Set是基于Map实现的,HashSet基于HashMap实现,将HashSet的数据作为HashMap的Key值保存,所以HashSet中元素不可重复,无序,允许null元素,线程不安全。
源码分析
HashSet字段
//基于HashMap实现
private transient HashMap map;
//虚拟一个value
private static final Object PRESENT = new Object();
构造方法
/**
* 默认无参构造,初始化了一个空的HashMap
*/
public HashSet() {
map = new HashMap<>();
}
/**
* 指定容量构造
*/
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
/**
* 指定容量和负载因子
*/
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
/**
* 指定容量、负载因子构造一个新的集合,非public有访问权限
* 只有LinkedHashSet涉及到
*/
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
/**
* 指定collection集合构造
*/
public HashSet(Collection c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
从这里我们可以看出HashSet基于HashMap实现
add方法
用HashMap的put方法完成HashSet的add操作,由于HashMap的key不可重复,所以HashSet中的元素不会重复,源码如下
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
remove方法
调用HashMap的remove方法
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
contains方法
由于HashSet的元素都作为HashMap的Key值保存,所以查询能否包含此key
public boolean contains(Object o) {
return map.containsKey(o);
}
迭代
获取HashMap的KeySet的迭代器
public Iterator iterator() {
return map.keySet().iterator();
}
clone方法
属于浅克隆
public Object clone() {
try {
HashSet newSet = (HashSet) super.clone();
newSet.map = (HashMap) map.clone();
return newSet;
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}
总结
HashSet基于HashMap实现,与HashMap一样无序,线程不安全,利用HashMap的key不可重复从而实现HashSet不含重复元素
写在最后:欢迎留言探讨,点“关注”,不迷路,加关注,持续升级!
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 详解Java集合中的HashSet