常用集合之HashSet源码浅析

搞懂 HashSet & LinkedHashSet 源码 以及集合常见面试题目 搞懂 HashSet & LinkedHashSet 源码 以及集合常见面试题目 经过上两篇的 HashMap 和 LinkedHashMap 源码分析以后,本文将继续分析 JDK 集合之 Set 源码,由于有了之前的 Map 源码分析的铺垫,Set 源码就简单很多了,本文的篇幅也将比之前短很多。查看 Set 源码的构造参数就可以知道,Set 内部其实维护的就是一个 Map,只是... 阅读详情

类图

源码

构造方法

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    //存储数据的对象,由此就可以看书HashSet是HashMap来实现的
    private transient HashMap<E,Object> map;
    //是所有写入 map 的 value 值。
    private static final Object PRESENT = new Object();

    public HashSet() {
        map = new HashMap<>();
    }

    public HashSet(int initialCapacity, float loadFactor) {
        map = new HashMap<>(initialCapacity, loadFactor);
    }

    public HashSet(int initialCapacity) {
        map = new HashMap<>(initialCapacity);
    }

    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    public int size() {
        return map.size();
    }
    //PRESENT是所有写入 map 的 value 值。
    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

    public boolean remove(Object o) {
        return map.remove(o)==PRESENT;
    }

    //...
}

偷偷告诉你,HashSet中没有 get 方法。

比较关键的就是这个add()方法。 可以看出它是将存放的对象当做了 HashMap 的健,value都是相同的 PRESENT 。由于 HashMap 的 key 是不能重复的,所以每当有重复的值写入到HashSet时,value会被覆盖,但 key不会受到影响,这样就保证了HashSet中只能存放不重复的元素。

这里又要多问一句了,为什么HashMap的键值是不重复的呢?因为在HashMap的源码中,是使用key的hashCode和key值去 取值的,hashCode总不能重复吧。这就有源有头了!

    public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
    }

    static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

ps: 文末推荐其他几篇有关集合的文章:

【Java集合框架】13——HashSet 类 HashSet 阅读详情

相关推荐

从源码分析HashSet集合

从源码分析HashSet集合简介构造函数HashSet()HashSet(Collection<? extends E> c)HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity)常用方法Iterator iterator()int size()boolean isEmpty()boolean contains(Object o)boolean add(E e)boolean remove(Object

1+1=王的博客 5030

浅析HashSet源码

对于 HashSet 而言,它是基于 HashMap 实现的,底层采用 HashMap 来保存元素,所以如果对 HashMap 比较熟悉了,那么学习 HashSet 也是很轻松的。HashSet是一个无重复数据的集合,存放的数据也是无序的。 构造方法 // HashSet底层是通过HashMap来实现的,所以具有HashMap的一切特性 private transient HashMap<E,Object> map; // 无参构造方法 public HashSet() { map =

程铭程铭你快成名的博客 6908

面试必备:Java集合源码浅析

说明:以下内容的分析源码,如没有特别说明,均来自JDK8.集合主要分为两组:单列集合和双列集合 单列集合一般是指存放单个对象的集合,而双列集合一般是以键值对形式存放的数据的集合。接口下有两个重要的子接口 ,,他们的实现子类都是单列集合。接口的实现子类有 、、,也都是双列集合。以下是集合类下两大主接口的类图关系。由于 接口直接继承了 ,它是没有实现的,它的所有方法都是由它的子接口的实现类进行实现,所以这里就以 下子接口 的实现类 来讲解。注意 是有序集合且元素可以重复,而 则是无序集合,元素不可重复

Xayla的博客 1026

【集合】——HashSet

HashSet 在 Java 编程中是一个功能强大且应用广泛的集合类,它的元素唯一性和无序性等特点使其在很多特定的业务场景中展现出独特的优势。深入理解它的原理、特性、方法以及相关注意事项,对于我们编写高效、准确的 Java 程序有着重要的意义,希望通过这篇详细的解析,能让大家对 HashSet 有一个更为透彻的掌握,在实际编程中能够运用自如。

架构师之路 925

基于STM32的半导体制冷片温度控制

制冷片温度控制,温控范围15℃~45℃,本人菜鸡一枚,大佬绕路。 #include "stm32f10x_gpio.h" #include "relay.h" void relay_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//Ê...

大白兔的博客 9015

Matlab实战:3种雷达间歇采样干扰的仿真与识别(附完整代码)

本文通过Matlab实战,详细仿真了雷达有源间歇采样干扰的三种核心样式:直接转发、重复转发和循环转发干扰。文章提供了完整的代码实现,并深入探讨了基于时频分析和循环平稳分析的特征提取与识别方法,为雷达抗干扰技术的学习与实践提供了清晰的工程实现路径。

weixin_29053695的博客 364

HashSet常用方法总结

HashSet的关系图: Conllection——>Set——>TreeSet和HashSet 。 HashSet常用方法: 1、add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。 2、size():返回Set集合中的元素个数。 3、remove(Object obj): 删除Set集合中的元素,删除成功返回true,否则返回fal...

徐冰的博客 1万+

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 391

Java集合 HashSet的源码分析及常用方法讲解

一. HashSet概述 HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet,并继承了Collection,HashSet集合很常用,同时也是程序员面试时经常会被问到的知识点,下面是结构图 二、源码分析 初始化 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Se

小码农吗 244

告别系统迁移蓝屏!用Intel RST驱动搞定11代酷睿装Win11的硬盘识别难题

本文详细介绍了如何通过Intel RST驱动解决11代酷睿处理器在安装Win11时遇到的硬盘识别问题。针对VMD技术导致的系统迁移蓝屏错误,提供了从驱动下载、PE环境创建到驱动注入的完整解决方案,帮助用户顺利完成系统升级或迁移。

weixin_31309419的博客 576

4、双足机器人mpc基础概念

机器人控制实际上不是连续的,是离散的,这就是控制信号的采样周期dt,一般每1ms对机器人发起一次控制信号。一般来说,dt越小,控制器的响应速度越快,但是由于预测的精度有限,如果控制时域过长,预测的误差会逐渐累积,导致控制器的性能下降。注意:1)在程序处理时,u的维度并不是由机器人的自由度确定的,是由其变量的个数及每个变量的空间维度确定,对于双足,采用力矩和力来控制,则u的维度是“2*2*3=12”。机器人实际运动过程中表现出来的状态x,x和xd是一致的,也包括运动速度ν、角速度ω、角度θ、位置p等。

1213

HashSet集合源码解析

A、HashSet 集合中存放的数据:不能重复,并且只能存放一个 null;B、HashSet 底层使用的仍然是 HashMap,底层使用的是:(数组 + 链表 )+ 红黑树;C、HashSet 中存放的数据是无序的,添加的顺序和取出的顺序不一致。

2403_87840982的博客 963

影楼精修-肤色统一算法解析

本文介绍了影楼精修中肤色统一算法的实现方案,并以像素蛋糕软件为例进行详细分析。肤色统一旨在通过调整人像照片中皮肤区域的颜色,使其看起来更加均匀一致。像素蛋糕软件提供了AI肤色统一和传统肤色统一两种功能,分别适用于不同需求。传统肤色统一算法通过皮肤分割、人脸检测、亮度统一和颜色统一等步骤,实现了对皮肤区域的精细调整。文章还提供了亮度统一的核心代码,并对比了传统算法与AI算法的效果,指出AI算法在自然度和亮度矫正方面表现更优。整体而言,本文为影楼精修中的肤色统一提供了实用的技术参考。

Trent1985的专栏 2068

java hashset 源码_Java集合之HashSet源码分析

一、HashSet简介HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素,具有很好的存取和查找性能。主要具有以下特点:不保证set的迭代顺序HashSet不是同步的,如果多个线程同时访问一个HashSet,要通过代码来保证其同步集合元素值可以是null当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,...

weixin_39860755的博客 184

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1200

39、低功耗处理器性能评估与Cortex - M23/M33低功耗特性解析

本文深入解析了Cortex-M23和Cortex-M33处理器的低功耗特性及其性能评估方法。介绍了ULPMark、CoreMark、IoTMark-BLE和SecureMark-TLS等基准测试在能效评估中的应用,并详细阐述了处理器的睡眠模式、系统控制寄存器(SCR)配置、WFI/WFE指令、退出时睡眠、挂起时发送事件(SEVONPEND)以及唤醒中断控制器(WIC)等关键低功耗机制。结合状态保留技术,展示了如何通过芯片级设计大幅降低泄漏电流,实现高效能低功耗的物联网与嵌入式系统设计。

Pepper的专栏 129

【Java集合】HashSet源码深度分析

本篇博文是对单列集合Set的实现类HashSet的内容补充。之前在Set集合的详解篇,只是拿HashSet演示了Set接口中的常用方法,并没有对它进行深究本文会从底层源码的角度对HashSet进入深入研究通过Debug从底层解释HashSet如何添加元素如何判断重复元素扩容机制链表转化为红黑树的过程本篇博文对HashSet源码的解读基于主流的JDK 8.0的版本HashSet是单列集合Set接口的常用实现类之一,满足Set集合"无序,不可重复"的特点。

m0_55908255的博客 1105

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

常用集合ArrayList,LinkedList,HashMap,HashSet源码分析

(一)ArrayList,可自动扩充容量的动态数组 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { private static final long ...

xiaoxuan1025的博客 247

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

java集合系列十一:HashSet源码解析

你应该先学习HashMap 介绍 不能包含重复元素 无序的 底层使用HashMap 允许存储null值 不是线程安全的 具有fail-fast机制 继承关系 继承类介绍 AbstractSet:该类提供了Set接口的基本实现,以减少实现该类所需要的工作 Set:不包含重复元素的集合的顶层接口 Cloneable:可被克隆 Serializable:可被序列化 源码解析 变量解析 构造函数...

duo_shine的博客 615

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java集合中HashSet的原理及常用方法

HashSet概述 HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet,并继承了Collection,HashSet集合很常用,同时也是程序员面试时经常会被问到的知识点,下面是结构图 public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable {} Has

weixin_39098944的博客 822

集合篇:Set—HashSet源码解析

HashSet源码解析1.HashSet整体架构2.HashSet组合HashMap的方法总结 Java中的HashSet和TreeSet两个类都是在Map的基础上组装而来的。侧重点也在于Set如何利用Map现有的功能实现自身的设计。 1.HashSet整体架构 HashSet是对HashMap进行组装后的产物,源码文件中对该类的描述具体有如下四点, 底层实现基于HashMap,所以迭代过程中不...

Jakob_Hu的博客 393

【Java集合四】HashSet详解

详细解析了 Java 集合框架中的 HashSet 类,包括其概述、源码解析、主要方法和实现原理。文章介绍了 HashSet 的无序、不可重复特性,以及其基于 HashMap 的底层数据结构。此外,还探讨了如何正确使用 HashSet 以及与 HashMap 的关联。

叉烧钵钵鸡的博客 982

Java 集合框架:HashSet

Java HashSet是Set接口的高效实现,基于HashMap存储元素(元素作为key,value为固定对象)。核心特性包括无序性、唯一性和常数时间的基本操作。构造方法允许指定初始容量和负载因子以优化性能,默认负载因子0.75平衡了时间和空间效率。关键方法如add()、remove()和contains()都委托给底层HashMap实现。使用时需注意:非线程安全(需手动同步)、快速失败机制、必须正确重写元素的hashCode()和equals()方法,以及避免使用可变对象作为元素

Java孩子的博客 1410

Java集合 HashSet的原理及常用方法

HashSet是Java集合Set的一个实现类,Set是一个接口,其实现类除HashSet之外,还有TreeSet,并继承了Collection,HashSet集合很常用,同时也是程序员面试时经常会被问到的知识点,本文主要介绍了HashSet的原理以及主要方法,同时简单介绍了LinkedHashSet和TreeSet

梁初夏的专栏 2833

【java集合框架源码剖析系列】java源码剖析之HashSet

注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本。本博客将从源码角度带领大家学习关于HashSet的知识。 一HashSet的定义: public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable可以看到HashSet继承自AbstractSe

(* ̄︶ ̄) 1839

java集合之HashSet源码浅析

本文基于JDK1.8来进行分析。 HashSet简介 HashSet实现了Set接口,实际上是一个HashMap的实例(源码中可以看到),它不保证集合的迭代顺序,允许元素为null; HashSet不是线程安全的,要保证线程安全,可以用Collections.synchronizedSet(Set s)或者CopyOnWriteArraySet类; HashSet不允许元素重复。 源码分析 p...

空调不够冷 229
上一篇: 常用集合之HashMap源码浅析
下一篇: 常用集合之LinkedHashMap源码浅析
She_lock
博客等级 码龄12年 157粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值