Java 中的 HashSet 和 HashMap 有什么区别?

news2025/3/12 12:31:07

一、核心概念与用途

特性HashSetHashMap
接口实现实现 Set 接口(存储唯一元素)实现 Map 接口(存储键值对)
数据存储存储单个对象(元素唯一)存储键值对(键唯一,值可重复)
典型用途去重集合(如用户 ID 集合)键值映射(如缓存数据、配置项)

二、内部实现机制

  1. HashSet 的底层依赖
    HashSet 内部通过 HashMap 实现,元素作为 HashMap 的键,值使用固定虚拟对象:

    // HashSet源码关键字段
    private transient HashMap<E, Object> map;
    private static final Object PRESENT = new Object(); // 虚拟值
    
    // add方法实现
    public boolean add(E e) {
        return map.put(e, PRESENT) == null; // 键存在则返回false
    }
    
  2. HashMap 的存储结构
    基于哈希表(数组 + 链表/红黑树),键通过哈希函数计算索引:

    // HashMap存储结构(Java 8+)
    transient Node<K,V>[] table;
    static class Node<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
    }
    

三、功能与方法差异

操作HashSet 方法HashMap 方法
添加元素add(E e)put(K key, V value)
删除元素remove(Object o)remove(Object key)
检查存在contains(Object o)containsKey(Object key)
获取元素无直接方法(需迭代器遍历)get(Object key)
容量相关size() 返回元素数量size() 返回键值对数量

四、性能与特性对比

维度HashSetHashMap
时间复杂度添加/删除/查找:平均 O(1),最差 O(log n)同左
内存开销较高(每个元素需额外存储虚拟值)较高(存储键值对)
允许 null 值允许一个 null 元素允许一个 null 键和多个 null
迭代顺序不保证顺序不保证顺序
线程安全非线程安全非线程安全

五、使用场景示例

  1. HashSet 适用场景

    • 用户登录去重

      Set<String> loggedInUsers = new HashSet<>();
      if (loggedInUsers.add(userId)) {
          // 首次登录处理
      }
      
    • 标签管理系统

      Set<String> uniqueTags = new HashSet<>(allTags);
      
  2. HashMap 适用场景

    • 缓存数据

      Map<String, Product> productCache = new HashMap<>();
      productCache.put(productId, product);
      
    • 配置项管理

      Map<String, String> configs = new HashMap<>();
      configs.put("timeout", "30");
      

六、线程安全解决方案

需求HashSet 方案HashMap 方案
同步包装Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());Map<String, String> syncMap = Collections.synchronizedMap(new HashMap<>());
并发容器无直接替代,可包装 ConcurrentHashMap:Set concurrentSet = Collections.newSetFromMap(new ConcurrentHashMap<>());ConcurrentHashMap<String, String>

七、内存与 GC 影响

  • HashSet 内存占用
    每个元素需存储键(元素对象)和固定虚拟值(约 16 字节对象头),内存开销约为元素大小的 2 倍。

  • HashMap 内存占用
    存储键值对,每个节点额外包含哈希值、指针等元数据,内存开销更高。

优化建议

  • HashSet 使用 -XX:+UseCompressedOops 压缩指针(64 位 JVM 默认开启)
  • HashMap 预估初始容量,避免频繁扩容

八、扩展对比:LinkedHashSet vs LinkedHashMap

特性LinkedHashSetLinkedHashMap
实现方式继承 HashSet,内部使用 LinkedHashMap维护插入顺序/访问顺序的双向链表
有序性保证插入顺序可配置插入顺序或访问顺序(LRU)
性能损耗略高于 HashSet(维护链表指针)略高于 HashMap

九、总结

  • 核心区别HashSet 用于存储唯一元素集合,HashMap 用于键值映射。
  • 实现关联HashSet 基于 HashMap 实现,复用其键唯一性特性。
  • 选择策略
    • 需要唯一元素集合 → HashSet
    • 需要键值对存储 → HashMap
    • 需要有序 → LinkedHashSet/LinkedHashMap
    • 高并发场景 → ConcurrentHashMap 包装或专用并发容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode 952】按公因数计算最大组件大小

题干 给定一个由不同正整数的组成的非空数组 nums &#xff0c;考虑下面的图&#xff1a; 有 nums.length 个节点&#xff0c;按从 nums[0] 到 nums[nums.length - 1] 标记&#xff1b;只有当 nums[i] 和 nums[j] 共用一个大于 1 的公因数时&#xff0c;nums[i] 和 nums[j]之…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.6 RNN与LSTM的变体与发展趋势】

引言:时间序列的魔法钥匙 在时间的长河中,信息如同涓涓细流,绵延不绝。而如何在这无尽的数据流中捕捉、理解和预测,正是循环神经网络(RNN)及其变体长短时记忆网络(LSTM)所擅长的。今天,我们就来一场深度探索,揭开RNN与LSTM的神秘面纱,看看它们如何在时间序列的海洋…

简单几个步骤完成 Oracle 到金仓数据库(KingbaseES)的迁移目标

作为国产数据库的领军选手&#xff0c;金仓数据库&#xff08;KingbaseES&#xff09;凭借其成熟的技术架构和广泛的市场覆盖&#xff0c;在国内众多领域中扮演着至关重要的角色。无论是国家电网、金融行业&#xff0c;还是铁路、医疗等关键领域&#xff0c;金仓数据库都以其卓…

八、SPI读写XT25数据

8.1 SPI 简介 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是一种同步串行通信协议&#xff0c;广泛用于嵌入式系统中连接微控制器与外围设备&#xff0c;如传感器、存储器、显示屏等。 主要特点 1. 全双工通信&#xff1a;支持同时发送…

Visionpro 齿轮测量

效果展示 一、题目要求 求出最大值&#xff0c;最小值&#xff0c;平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…

索引以及索引底层数据结构

一、什么是索引&#xff1f; 索引&#xff08;index&#xff09;是数据库高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff08;B树&#xff09;&#xff0c;这些数据结构以某种方式指向真在…

开业盛典活动策划方案拆解

道叔来给大家详细剖析咱们方案库里刚收录的这份《蜀大侠火锅店武侠风开业盛典活动策划方案》了&#xff0c;保证让你看完直呼过瘾&#xff0c;收获满满&#xff01; 一、主题创意&#xff1a;武侠风&#xff0c;直击人心 首先&#xff0c;咱们得夸一下这活动的主题——“XXX‘…

API 接口自动化

HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器&#xff0c;如何在chrome浏览器中查看 请求和响应的HTTP消息&#xff1f;按f12-》network 清除当前信息 响应的消息体在Response里看 点preview&#xff0c;可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…

安全测试|SSRF请求伪造

前言 SSRF漏洞是一种在未能获取服务器权限时&#xff0c;利用服务器漏洞&#xff0c;由攻击者构造请求&#xff0c;服务器端发起请求的安全漏洞&#xff0c;攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…

智能编程助手功能革新与价值重塑之:GitHub Copilot

引言&#xff1a; GitHub Copilot 的最新更新为开发者带来了显著变化&#xff0c;其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令&#xff0c;并具备多级任务推理能力&#xff0c;这使得开发者在开发复杂功能时&#xff0c;可大幅减少…

物联网行业通识:从入门到深度解析

物联网行业通识&#xff1a;从入门到深度解析 &#xff08;图1&#xff1a;物联网生态示意图&#xff09; 一、引言&#xff1a;万物互联时代的到来 根据IDC最新预测&#xff0c;到2025年全球物联网设备连接数将突破410亿&#xff0c;市场规模达1.1万亿美元。物联网&#xff…

ABP - 事件总线之分布式事件总线

ABP - 事件总线之分布式事件总线 1. 分布式事件总线的集成1.2 基于 RabbitMQ 的分布式事件总线 2. 分布式事件总线的使用2.1 发布2.2 订阅2.3 事务和异常处理 3. 自己扩展的分布式事件总线实现 事件总线可以实现代码逻辑的解耦&#xff0c;使代码模块之间功能职责更清晰。而分布…

再谈SpringCloud Gateway源码

再谈SpringCloud Gateway源码 一、整体请求流程二、前置对象准备1、实例化HandlerMapping2、实例化Route3、实例化WebHandler 三、实践业务扩展点1、定义扩展Route对象2、Filter能做什么3、定义扩展Filter对象4、定义父类Filter简化请求参数处理 前言&#xff1a; 之前有阅读过…

把 CSV 文件摄入到 Elasticsearch 中 - CSVES

在我们之前的很多文章里&#xff0c;我有讲到这个话题。在今天的文章中&#xff0c;我们就提重谈。我们使用一种新的方法来实现。这是一个基于 golang 的开源项目。项目的源码在 https://github.com/githubesson/csves/。由于这个原始的代码并不支持 basic security 及带有安全…

C进阶 数据的存储

目录 前言 一&#xff0c;VS的知识储备 二&#xff0c;有趣的scanf()读取 三&#xff0c;数据的存储 引言 四&#xff0c;整数存储 五&#xff0c;小数存储 总结 前言 这里将深入计算机&#xff0c;看计算机是如何进行数据的存储的&#xff0c;怎么在计算机里面筑巢 为…

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗&#xff1f; 1.线程终止会导致进程终止吗&#xff1f; 在操作系统中&#xff0c;线程是进程的基本执行单元&#xff0c;一个进程可以包含一个或多个线程。 当一个子线程终止时&#xff0c;进程并不会因此自动终…

springcloud集成gateway

本篇文章只介绍gateway模块的搭建步骤&#xff0c;并无gateway详细介绍 gateway详解请查看&#xff1a;SpringCloudGateway官方文档详解 前置处理 父模块中已指定版本 不知道如何选择版本看这篇&#xff1a; 手把手教你梳理springcloud与springboot与springcloudalibaba的版本…

pandas(13 Caveats Gotchas和SQL比较)

前面内容&#xff1a;pandas(12 IO工具和稀松数据) 目录 一、Caveats警告 & Gotchas预见 1.1 在Pandas中使用if/Truth语句 1.2 位运算布尔 1.3 isin操作 1.4 重新索引reindex和 loc&iloc 使用注意事项 1.5 loc和iloc 二、Python Pandas 与SQL的比较 2.1 数…

Android的Activity生命周期知识点总结,详情

一. Activity生命周期 1.1 返回栈知识点 二. Activity状态 2.1 启动状态 2.2 运行状态 2.3 暂停状态 2.4 停止状态 2.5 销毁状态 三. Activity生存期 3.1 回调方法 3.2 生存期 四. 体验Activity的生命周期 五. Activity被回收办法 引言&#xff1a; 掌握Acti…

基于Python的Flask微博话题舆情分析可视化系统

2024数据 ✅️标价源码 远程部署加 20 ✅️爬虫可用 有六月数据 ✅️修复bug不会突然打不开网页 系统稳定 系统的功能如下: 1.数据的爬取 2.用户的登录注册 3.热词统计&#xff0c;舆情统计 4.文章统计分析 5.发布地址统计 6.评论统计 7.情感分类统计 编程语言&#xff1a;py…