HashSet(源码解读)

简介: HashSet(源码解读)

HashSet概述

HashSet的代码行数 300多行,是我见过最少代码的集合了,非常简单,它有以下的特点

  • 没有重复元素的集合。底层基于HashMap来实现。
  • 非线程安全,创建线程安全的HashMap可以使用Collections.synchronizedSet。

HashSet源码解读

继承关系

  • 继承AbstractSet抽象类,实现Set接口
  • 实现java.io.Serialization接口,支持序列化
  • 实现Cloneable接口,支持对象克隆,浅复制

属性

     //使用HashMap来保存HashSet的元素
    private transient HashMap<E,Object> map;

    //HashSet只使用到key,因此使用一个静态常量来充当HashSet的value值
    private static final Object PRESENT = new Object();
复制代码

构造方法

  //使用默认容量大小16以及加载因子0.75初始化HashMap,构造HashSet
    public HashSet() {
        map = new HashMap<>();
    }

    //初始化指定集合和默认加载因子0.75的map,构造HashSet
    public HashSet(Collection<? extends E> c) {
        map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }

    //使用指定容量大小和加载因子初始化map,构造HashSet
    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    //使用指定容量大小和默认加载因子0.75初始化map,构造HashSet
    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    //包访问权限,构造空的LinkedHashSet
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
复制代码

方法

  • size()方法:内部调用Map的size方法。
    public int size() {
        return map.size();
    }
复制代码
  • isEmpty()方法,也是调用map,里面是通过判断size是否为0来判断是否为null
 public boolean isEmpty() {
        return map.isEmpty();
    }
复制代码
  • add()方法 HashSet的add方法内部通过HashMap.put()方法来实现key的添加,在HashMap内部真正执行的是putVal()方法,putVal这边就不说了 HashMap讲过
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }
复制代码

总结

HashSet 还真没啥讲了 ,就是把HashMap的key 拿来当数据存,基本上都是调用的是HashMap的方法,所以说讲的也少,总结一下吧

  • HashSet的实现支持null的key,同时HashSet的内部不支持重复的key
  • 不重复
  • 线程不安全


目录
相关文章
|
11月前
|
存储 缓存 监控
社交软件红包技术解密(四):微信红包系统是如何应对高并发的
本文将为读者介绍微信百亿级别红包背后的高并发设计实践,内容包括微信红包系统的技术难点、解决高并发问题通常使用的方案,以及微信红包系统的所采用高并发解决方案。
339 13
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
1532 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
755 0
Python中的while循环
Python中的while循环
|
存储 运维 物联网
【专栏】OceanBase 是一款先进的分布式数据库系统,以其分布式架构、高扩展性、高可用性和强一致性特点,应对大规模数据处理挑战
【4月更文挑战第29天】OceanBase 是一款先进的分布式数据库系统,以其分布式架构、高扩展性、高可用性和强一致性特点,应对大规模数据处理挑战。它支持混合负载,适用于金融、电商和物联网等领域,提供高性能、低成本的解决方案。尽管面临技术复杂性、数据迁移和性能优化等问题,通过合理策略可克服挑战。随着技术发展,OceanBase 在数字化时代将持续发挥关键作用。
660 1
|
机器学习/深度学习 人工智能 并行计算
LabVIEW图形化的AI视觉开发平台(非NI Vision)VI简介
LabVIEW图形化的AI视觉开发平台(非NI Vision)VI简介
681 0
|
消息中间件
Anaconda安装之后Spyder打不开解决办法--目前有用 jupyter notebook 无法正常运行2023.1.7
Anaconda安装之后Spyder打不开解决办法--目前有用 jupyter notebook 无法正常运行2023.1.7
605 0
|
机器学习/深度学习 人工智能 算法
机器学习PAI-Designer基础
机器学习PAI-Designer基础
580 0
|
达摩院 并行计算 TensorFlow
|
流计算
《实时数仓“王炸组合”实时计算Flink版+Hologres》电子版地址
精品的内容促使训练营非常受大家的欢迎,为满足大家求知学习的劲头,我们现将《实时数仓入门训练营》的课程内容全部整理了出来!汇编成《实时数仓“王炸组合”-实时计算Flink版+Hologres》的合集电子书!供各位小伙伴学习参考,免费下载!
572 0
《实时数仓“王炸组合”实时计算Flink版+Hologres》电子版地址