【Java集合】系列二:搞定HashSet(本篇源码基于Java11)

Java彩票模拟:HashSet、ThreadLocalRandom与Scanner深度实践 Java集合框架中的HashSet提供O(1)平均时间复杂度的去重能力,其底层哈希表机制依赖hashCode与equals契约,是实现‘不重复随机数’约束的最优选择;伪随机数生成器如ThreadLocalRandom通过线程局部种子规避并发碰撞,显著优于传统Random实例;而Scanner作为标准输入门面,需警惕缓冲区残留、资源泄漏及非法输入校验等常见陷阱。三者协同构成Java基础能力的压力测试场,广泛应用于抽奖系统、测试数据生成、风控规则模拟等工程场景。本文以9个100~999区间不重复随机数生成为切口 阅读详情

1 概念

HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它保存的都是非重复的元素,不保证set的迭代顺序。此类允许使用null元素。
对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet 的实现比较简单,相关HashSet的操作,基本上都是直接调用底层HashMap的相关方法来完成。

2 源码解读

先来看下构造函数相关源码:

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

可以看到,HashSet底层采用的其实是HashMap。
再来看看add()方法的源码:

    public boolean add(E e) {
        //成功添加则返回true,否则返回false
        return map.put(e, PRESENT)==null;
    }
 
    
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
    
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

我们看到调用的也是HashMap的put()方法,将添加的元素作为HashMap的key,如果成功添加就返回true,否则返回false。

3 应用实例

这里我想用一个应用实例来说明HashSet的用法。
对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。
给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
测试样例:
“seume666”,8

返回:
e

实现代码也很简单:

/**
 * @author Carson Chu, 1965704869@qq.com
 * @date 2020/4/13 20:41
 * @description
 */
public class Main {
    public static void main(String[] args) {
        System.out.println(findChar("seume666", 8));
    }

    public static char findChar(String input, int length) {

        char[] a = input.toCharArray();
        HashSet hashSet = new HashSet<>();
        for (int i = 0; i < length; i++) {
            if (!hashSet.add(a[i])) {
            	//添加失败,说明已经存在于set集合中,直接返回
                return a[i];
            }
        }
        return 0;
    }
}
Java集合容器深度解析:从源码原理到面试实战选型指南 在Java开发中,集合框架是日常编码与面试考察的核心知识模块。无论是ArrayList的扩容机制、HashMap的红黑树优化,还是并发容器的锁粒度演进,其本质都是对数据结构设计与性能取舍的工程实践。理解集合框架从接口抽象到具体实现的层次关系,掌握快速失败机制、哈希扰动函数、负载因子等关键原理,有助于开发者做出合理的容器选型。例如,在涉及大量元素存储时预估容量避免频繁扩容,在并发读写场景下根据读写比例选择ConcurrentHashMap或CopyOnWriteArrayList。集合框架的设计思想还渗透至工 阅读详情

相关推荐

Java集合框架实战指南:从核心原理到高频面试题解析

集合框架是Java编程语言中用于存储和操作数据组的核心架构,它基于数组、链表、哈希表等基础数据结构构建,通过提供List、Set、Map等统一接口,实现了数据管理的高效与灵活。其核心原理在于动态扩容、哈希算法与红黑树优化,这直接决定了程序在数据处理时的性能与线程安全。掌握集合框架的技术价值在于能够根据实际场景,如高并发缓存设计或大数据量去重,选择最合适的容器类型,从而优化内存使用与执行效率。本文聚焦于ArrayList与HashMap等高频搜索关键词,深入探讨其扩容机制、线程安全陷阱及性能调优,并结合Con

weixin_30813225的博客 642

Java语言:Java集合之HashSet查找和删除数据

目录 查找 删除 这里还是以宠物猫为例 总结一下HashSet中查找和删除数据的方法 查找 先说一下总体思路: 这里还是以宠物猫为例,(不是为了水文章,因为可能全部放在一起的话,一是自己不好查找知识点,另外还有就是放在一篇blog中显得过于冗长) 在HashSet中存储了宠物猫的信息 查找需要进行查询操作的宠物猫信息 查找的方式:第一种,通过对象名查找 不过谁能知道对象名啊!一般都是使用宠物猫的名字进行查找 所以第二种就是通过宠物猫的名字进行查找 ...

日出印象 7842

jdk源码包jdk-11.0.1

jdk源码包

11 java源码解析-Thread

 其他 源码解析 https://blog.youkuaiyun.com/qq_32726809/article/category/8035214  1类的声明 public class Thread implements Runnable 实现了Runnable接口 在程序开发中只要是多线程肯定永远以实现Runnable接口为主。 1.1Runnable 说明 public inte...

银银豆豆的博客 557

JDK11源码 jdk-11.0.4 src源码

jdk-11.0.4-src.7z,jdk-11.0.4的源码、src源码,仅供学习参考交流。

j11:Java 11

1111 Java 11

java set取最大最小,查找HashSet中的最大最小元素

import java.util.Collections;import java.util.HashSet;public class FindMinMax {public static void main(String[] args) {// TODO Auto-generated method stubHashSet hashSet = new HashSet();hashSet.add(new...

weixin_39616565的博客 1454

jdk11的源码src文件

jdk11的官方源代码src.zip文件,jdk版本11.0.2 2019/1/15

读 Java 11 源码(1)ArrayList

查找 这个最简单,基本逻辑上就是遍历,然后匹配,但是在匹配上,有讲究。 /** * Returns the index of the first occurrence of the specified element * in this list, or -1 if this list does not contain the element. * More formally, return...

RAYFUXK的专栏 273

CANOE DIVA 工程怎样在具体服务前增加前置条件

然后会在CANoe的Test Module视窗中发现一个跟系统条件相关的Test Module模块,在该模块中有生成跟系统条件相关的CAPL 脚本。这里需要根据你的实际项目进行更改,diva工程加载到canoe的工程的时候,会同步加入你创建的cdd文件,这里示例的ABS_ESP 就是你的cdd的ECU命名,后面就是具体的前置条件服务。4、配置完成后,测试用例就会如下图Trace窗口所示,在每一次10 02请求之前都会调用CAPL Function的PreconditionCheck函数中定义的脚本。

weixin_45940007的博客 1966

ELK - CentOS7 安装 elasticsearch 7.17.5

elk elasticsearch 安装

qq_19783793的博客 1461

Java HashSet介绍、使用方法详解及底层实现分析

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。HashSet 允许有 null 值。HashSet 是无序的,即不会记录插入的顺序。HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 必须在多线程访问时显式同步对 HashSet 的并发访问。HashSet 实现了 Set 接口。...

qq_52972504的博客 5384

USB摄像头开发避坑指南:UVC协议中的Alternate Setting详解

本文深入解析UVC协议中的Alternate Setting机制,这是USB摄像头开发中影响视频流稳定性的关键。文章通过实际案例,详解了Alternate Setting如何管理USB带宽分配,并分析了帧率不达标、图像花屏等典型问题的根源与排查方法,为开发者提供实用的避坑指南和调试技巧。

meat5的博客 240

【搞定Java基础-集合】第十篇:Java 集合类总结篇

目录 序言:Collection 一、List 总结篇 1、List 接口描述 2、使用场景 3、区别 3.1Aarraylist 和 Linkedlist 3.2 Vector 和 ArrayList 的区别 二、Map 总结篇 2.0 HashMap 和TreeMap的不同点 2.1、Map 概述 2.2、内部哈希:哈希映射技术 2.3 Map 优化 2....

ZHAOJING1234567的博客 696

Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌

AI 数字人直播系统是利用人工智能技术创建虚拟主播,并通过数字化技术实现直播互动的系统1。以下是其相关介绍:Ai数字人直播系统搭建,本地源码部署,源码交付--支持OEM系统贴牌。

weixin_ggwwsscc的博客 621

保姆级避坑指南:用Livox官方工具搞定Mid-360多雷达自动标定(附源码Bug修复)

本文详细解析了使用Livox官方工具进行Mid-360多雷达自动标定的全流程,包括环境搭建、工具链配置、关键Bug修复及数据采集最佳实践。重点解决了PointCloudMapper.cpp边界检查缺失和calibration.cpp点云显示问题,提供了实用的代码修复方案和标定质量评估指标,帮助开发者高效完成激光雷达标定任务。

weixin_29053695的博客 281

Java 集合框架万字梳理:从底层原理、源码细节到生产选型,一篇全搞定

本文系统梳理 Java 集合框架完整知识体系,涵盖核心接口、主流实现类底层原理、迭代机制、高频坑点、Stream API 以及生产场景选型指南,一篇帮你建立完整的集合知识体系。

一线 Java 开发,专注 Java 核心原理、生产踩坑与架构面试实战。 569

静态分析工具COBOT与Testbed对比

Testbed为规则检查工具的代表,市场占有量非常大,但随着时间的推移,大家从规则匹配转向了用静态分析工具检查Bug,所以规则检查型工具占有量比开始时候已经减少,但仍有一些比较落后的单位还在继续采购此类工具。3、通过对开源工程的测试,进行误漏报率的对比,发现COBOT(库博)的误漏报率相比Testbed较低,因COBOT主打国内市场,在众多军工单位进行大量试用及使用,吸取了众多单位的意见和建议,更加符合国内军工单位的使用习惯及测试要求。4、此外库博在功能上还可以进行计划任务,检测队列,检测并发的功能支持。

chengoodflower的博客 2056

Java集合终极版!看这一篇就够了!超详细!

Java集合主要由两个接口派生出来的:Collection和Map Collection:用于存放单一元素 List存放有序可重复数据 Set存放无序不可重复数据 Map:用于存放key-value键值对数据

m0_55611144的博客 659

2025 华为OD机试真题e卷 C语言 实现【竖直四子棋】

竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。

MISAYAONE的博客 1417

Spring-AI 第 17 章 - 飞书机器人接入详解

✅ Stream 长连接(官方 SDK)✅ AI 对话(支持工具调用)✅ 消息接收与回复✅ 天气查询✅ 数据库查询✅ 数学计算✅ 事件去重Stream 长连接模式:使用官方 SDK 建立 WebSocket 长连接,服务器主动连接飞书,无需公网 IP消息处理流程:接收消息 → 解析内容 → AI 处理 → 回复用户AI 工具调用:接入 FunctionTools,支持天气、计算、日期、数据库查询等多种工具。

AppBlog.CN全栈架构 211

狂命爆肝99天,共52K字的JAVA学习笔记奉上,JAVA从入门到精通一文搞定,一文在手JAVA无忧

本文介绍了Java编程的基础知识、开发环境设置、JVM内存划分以及常用关键字。Java分为JavaSE、JavaEE和JavaME三个版本,分别用于桌面、企业和嵌入式系统开发。编译使用javac,运行使用java,JDK是开发工具包,JRE是运行环境,JVM是虚拟机。JVM内存分为堆、方法区和栈,分别存储实例变量、静态变量和局部变量。常用关键字包括public、static、final、this和super,分别用于定义类、静态成员、常量、当前对象引用和父类特征。开发环境IDEA的快捷键和组织方式也进行了总

渣渣盟的博客 4万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java面试7天突击:高频考点与实战复习路线

在Java技术面试中,系统化复习是提升通过率的关键。理解Java虚拟机(JVM)内存模型、垃圾回收机制以及并发编程中的锁与线程池原理,是构建稳固知识体系的基础。这些核心原理不仅决定了程序性能与稳定性,更是面试中考察开发者深度的重要标尺。从技术价值看,掌握JVM调优能有效解决线上OOM问题,而精通并发工具类(如ReentrantLock、CountDownLatch)则能提升高并发场景下的系统设计能力。在实际应用场景中,无论是微服务架构下的Spring Bean生命周期管理,还是数据库MySQL的索引优化与事

weixin_33946605的博客 849

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

蓝桥杯Java备赛真相:破除100题迷思,构建能力三维坐标系

蓝桥杯Java组并非传统算法竞赛,而是一场对Java语言深度、算法建模粒度与工程精度的综合检验。其本质是考察在严格资源约束下,将业务需求精准映射为数学模型与JDK API调用的能力。题目高频依赖JDK标准库语义(如DateTimeFormatter、ConcurrentHashMap.computeIfAbsent)、数学推导(L1类公式解)及API边界行为(如BigInteger.multiplyToLen优化),而非模板化算法套用。死记‘100题’忽视了近67%真题属于L1/L2难度——即O(1)解或精

weixin_33671935的博客 677

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

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

25万+字干货|Java面试85题图解版:43道高频真题速查手册(八股+源码双吃透)

本文为25万字超全干货的Java面试85题图解完整版手册,精选43道大厂高频面试真题,摒弃传统死记硬背八股文模式,采用三句标准答案、生活化场景比喻、核心结构图解的方式,通俗讲解Java基础、并发、JVM、数据库、框架等核心考点。每道题目配套实战避坑指南、面试官高频追问与源码解析,实现八股背诵与底层源码双向吃透,适合校招、社招程序员考前速刷、长期复盘,轻松攻克Java面试重难点。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 795

Java实习面试八股文怎么学?3天突击计划+答题框架

Java开发者备战实习面试,往往需要系统梳理编程基础与核心原理。理解集合框架、并发编程、JVM内存模型等底层概念,是提升技术敏感度和问题分析能力的关键。掌握HashMap的底层演化、线程池的参数调优、垃圾回收的执行机制等高频考点,不仅能应对面试提问,更能在实际项目中做出更优的技术选型与性能优化。将抽象理论还原为工程实践,通过清晰的答题逻辑和项目关联表达,才能让面试官快速认同你的技术潜力。本文提供一套3天高效突击方案,聚焦最常考的五大模块,配合可直接套用的答题框架,帮助读者在有限时间内抓住重点,从容应对Jav

优快云头条 1150
上一篇: 【Java集合】系列一:详解ArrayList的底层原理(本篇源码基于Java11)
下一篇: Java并发编程(四):CyclicBarrier原理详解
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值