详解Java集合中的HashSet

作者 : 开心源码 本文共1471个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共196人阅读

简述

在写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

发表回复