详解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不含重复元素

Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频免费获取架构群:854180697    加群链接

写在最后:欢迎留言讨论,点“关注”,不迷路,加关注,持续更新!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    曹振华阅读 7,206评论 1 37
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,712评论 0 16
  • 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算...
    Alex_1799阅读 3,538评论 0 5
  • 以后 我想这样生活: 清晨 听露珠和花朵咬着耳朵说情话 随手摘下几朵娇羞 插在各种形状的器皿里 然后 泡上壶茶 ...
    汐婳兒2369阅读 1,163评论 0 0
  • 阳春三月本是争仙多艳的季节,而此刻却没有了以往的意气风发是因为你的离开还是。。。。。。 我们相识与网络因性...
    恺浅阅读 2,999评论 0 0