当前位置: 首页 > article >正文

【JavaSE全面教学】Java集合框架下Day13(2026年)

写在前面这是JavaSE系列的第13篇。上一篇讲了List家族今天来讲Set和Map。HashMap是面试中问得最多的集合类底层原理必须搞懂。建议收藏反复看。文章目录一、Set集合不可重复1.1 Set的特点1.2 HashSet1.3 LinkedHashSet1.4 TreeSet1.5 Set对比二、Map集合键值对2.1 Map的基本使用2.2 HashMap的常用方法2.3 HashMap的底层原理面试重点2.4 HashMap的面试高频问题2.5 LinkedHashMap2.6 TreeMap2.7 Map对比参考资料三、总结一、Set集合不可重复1.1 Set的特点Set无序、不可重复 ├── HashSet → 基于HashMap无序 ├── LinkedHashSet → 基于LinkedHashMap保持插入顺序 └── TreeSet → 基于TreeMap自动排序1.2 HashSet实际场景在开发登录注册功能时需要判断用户名是否已存在。用List需要遍历查找效率低用HashSet只需O(1)就能判断。importjava.util.HashSet;importjava.util.Set;SetStringsetnewHashSet();// 添加元素自动去重set.add(Java);set.add(Python);set.add(Java);// 重复不会添加set.add(C);System.out.println(set);// [Java, C, Python]顺序不固定// 常用方法set.size();// 3set.contains(Java);// trueset.remove(Python);// 删除set.isEmpty();// falseset.clear();// 清空// 遍历和List一样for(Strings:set){System.out.println(s);}set.forEach(s-System.out.println(s));HashSet去重原理踩坑提醒自定义对象存入HashSet时如果不重写hashCode和equals去重会失效因为默认的hashCode是对象地址每个new出来的对象地址都不同。// HashSet底层是HashMap// 添加元素时先计算hashCode// 如果hashCode相同再调用equals比较// hashCode和equals都相同才认为是重复元素classStudent{Stringname;intage;// 必须重写hashCode和equals才能正确去重Overridepublicbooleanequals(Objecto){if(thiso)returntrue;if(onull||getClass()!o.getClass())returnfalse;Studentstudent(Student)o;returnagestudent.ageObjects.equals(name,student.name);}OverridepublicinthashCode(){returnObjects.hash(name,age);}}SetStudentsetnewHashSet();set.add(newStudent(张三,20));set.add(newStudent(张三,20));// 重复不会添加set.add(newStudent(李四,21));System.out.println(set.size());// 21.3 LinkedHashSet// LinkedHashSet保持插入顺序SetStringsetnewLinkedHashSet();set.add(C);set.add(A);set.add(B);System.out.println(set);// [C, A, B]按插入顺序1.4 TreeSetimportjava.util.TreeSet;// TreeSet自动排序自然排序TreeSetIntegersetnewTreeSet();set.add(30);set.add(10);set.add(20);set.add(10);// 重复不添加System.out.println(set);// [10, 20, 30]自动排序// 自定义排序TreeSetStringset2newTreeSet(Comparator.reverseOrder());set2.add(A);set2.add(C);set2.add(B);System.out.println(set2);// [C, B, A]降序// TreeSet的特有方法TreeSetIntegernumsnewTreeSet(Arrays.asList(1,3,5,7,9));nums.first();// 1最小值nums.last();// 9最大值nums.lower(5);// 3严格小于5的最大值nums.floor(5);// 5小于等于5的最大值nums.higher(5);// 7严格大于5的最小值nums.ceiling(5);// 5大于等于5的最小值nums.subSet(3,7);// [3, 5]3到7之间不含7nums.headSet(5);// [1, 3]小于5nums.tailSet(5);// [5, 7, 9]大于等于51.5 Set对比特性HashSetLinkedHashSetTreeSet底层HashMapLinkedHashMapTreeMap有序性无序插入顺序排序null值允许允许不允许性能O(1)O(1)O(log n)去重依据hashCodeequalshashCodeequalscompareTo二、Map集合键值对2.1 Map的基本使用importjava.util.HashMap;importjava.util.Map;MapString,IntegermapnewHashMap();// 添加键值对map.put(Java,1);map.put(Python,2);map.put(C,3);map.put(Java,10);// key重复value覆盖// 获取值Integervaluemap.get(Java);// 10Integerdefmap.get(Go);// nullkey不存在// 安全获取Integerv2map.getOrDefault(Go,0);// 0key不存在返回默认值// 判断map.containsKey(Java);// truemap.containsValue(1);// false1已被覆盖为10// 删除map.remove(C);// 删除指定key// 遍历// 方式1entrySet推荐for(Map.EntryString,Integerentry:map.entrySet()){System.out.println(entry.getKey() → entry.getValue());}// 方式2keySetfor(Stringkey:map.keySet()){System.out.println(key → map.get(key));}// 方式3forEachJava 8map.forEach((key,val)-System.out.println(key → val));// 方式4valuesfor(Integerv:map.values()){System.out.println(v);}// 大小map.size();// 2map.isEmpty();// falsemap.clear();// 清空2.2 HashMap的常用方法MapString,IntegermapnewHashMap();// putIfAbsentkey不存在才放入map.putIfAbsent(Java,1);// 放入map.putIfAbsent(Java,10);// 不放入key已存在// computeIfAbsentkey不存在才计算map.computeIfAbsent(Python,k-k.length());// Python长度6// computeIfPresentkey存在才计算map.computeIfPresent(Java,(k,v)-v1);// Java的value1// merge合并值map.merge(Java,1,Integer::sum);// Java的value1// replace替换map.replace(Java,100);// 替换Java的value为100// getOrDefaultmap.getOrDefault(Go,0);// Go不存在返回02.3 HashMap的底层原理面试重点面试必问HashMap的底层原理几乎是Java面试的送分题但很多人答不全。下面从数据结构、put过程、扩容机制三个维度彻底讲透。// HashMap底层数组 链表 红黑树JDK 8// 数据结构// 数组的每个位置叫一个桶bucket// 每个桶可以存一个链表或红黑树transientNodeK,V[]table;// 哈希桶数组staticclassNodeK,V{finalinthash;// 哈希值finalKkey;// 键Vvalue;// 值NodeK,Vnext;// 下一个节点链表}// JDK 8之前数组 链表// JDK 8之后数组 链表 红黑树链表长度8时转红黑树put过程图解1. 计算key的hashCode 2. 对hashCode进行扰动处理减少冲突 3. 用(n-1) hash计算桶的位置 4. 如果桶为空直接放入 5. 如果桶不为空 a. 如果key相同覆盖value b. 如果key不同加入链表尾部 c. 如果链表长度8且数组长度64转红黑树 桶数组table ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤ │null │ [A] │null │ [B] │null │ [C] │null │null │ │ │ ↓ │ │ ↓ │ │ ↓ │ │ │ │ │ [D] │ │ [E] │ │ [F] │ │ │ │ │ ↓ │ │ │ │ ↓ │ │ │ │ │ [G] │ │ │ │ [H] │ │ │ └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘扩容机制经验之谈如果知道数据量大小一定要在创建HashMap时指定初始容量避免频繁扩容影响性能。比如要存1000个元素可以new HashMap(2048)2的幂次方。// 默认初始容量16// 默认负载因子0.75// 扩容阈值16 * 0.75 12// 当元素数量超过阈值时扩容为原来的2倍// 16 → 32 → 64 → 128 → ...// 为什么负载因子是0.75// 太小空间浪费// 太大哈希冲突增多查询效率降低// 0.75是时间和空间的平衡点踩坑提醒HashMap扩容时需要重新计算所有元素的哈希位置rehash这是一个非常耗时的操作。在性能敏感的场景下避免HashMap频繁扩容。2.4 HashMap的面试高频问题问题1hashCode和equals的关系// 1. 两个对象equals为truehashCode必须相同// 2. 两个对象hashCode相同equals不一定为true哈希冲突// 3. 重写equals必须重写hashCode// 正确的hashCode实现OverridepublicinthashCode(){returnObjects.hash(name,age);}Overridepublicbooleanequals(Objecto){if(thiso)returntrue;if(onull||getClass()!o.getClass())returnfalse;Studentstudent(Student)o;returnagestudent.ageObjects.equals(name,student.name);}问题2HashMap为什么线程不安全// JDK 7多线程扩容时可能产生环形链表导致死循环// JDK 8多线程put可能导致数据丢失// 解决方案// 1. ConcurrentHashMap推荐// 2. Collections.synchronizedMap()// 3. Hashtable不推荐锁粒度太大经验之谈实际开发中如果需要线程安全的Map直接用ConcurrentHashMap。它使用分段锁JDK 7或CASsynchronizedJDK 8性能远优于Hashtable。问题3HashMap的key可以为null吗// HashMapkey可以为null只有一个放在桶0// TreeMapkey不能为null需要比较// ConcurrentHashMapkey和value都不能为null2.5 LinkedHashMap实际应用LinkedHashMap的访问顺序模式是实现LRU缓存的基础。很多缓存框架如Guava Cache、LruCache都是基于它实现的。// LinkedHashMap保持插入顺序MapString,IntegermapnewLinkedHashMap();map.put(C,3);map.put(A,1);map.put(B,2);System.out.println(map);// {C3, A1, B2}按插入顺序// 访问顺序LRU缓存MapString,IntegerlrunewLinkedHashMap(16,0.75f,true);lru.put(A,1);lru.put(B,2);lru.get(A);// 访问AA移到最后lru.put(C,3);System.out.println(lru.keySet());// [B, A, C]A被访问过移到后面2.6 TreeMap// TreeMap按key排序TreeMapString,IntegermapnewTreeMap();map.put(C,3);map.put(A,1);map.put(B,2);System.out.println(map);// {A1, B2, C3}按key排序// 自定义排序TreeMapString,Integermap2newTreeMap(Comparator.reverseOrder());map2.put(C,3);map2.put(A,1);System.out.println(map2);// {C3, A1}降序// TreeMap的特有方法TreeMapInteger,StringtreeMapnewTreeMap();treeMap.put(1,A);treeMap.put(3,C);treeMap.put(5,E);treeMap.firstKey();// 1treeMap.lastKey();// 5treeMap.lowerKey(3);// 1treeMap.higherKey(3);// 5treeMap.subMap(1,5);// {1A, 3C}2.7 Map对比特性HashMapLinkedHashMapTreeMapHashtable底层数组链表红黑树数组链表红黑树红黑树数组链表有序性无序插入/访问顺序按key排序无序null key允许1个允许1个不允许不允许null value允许允许不允许不允许线程安全不安全不安全不安全安全性能O(1)O(1)O(log n)O(1)参考资料Oracle官方文档 - Map接口美团技术团队 - Java 8系列之重新认识HashMap三、总结今天我们学习了✅ Set集合的使用和去重原理✅ Map集合的使用✅ HashMap的底层原理数组链表红黑树✅ HashMap的扩容机制✅ LinkedHashMap和TreeMap的特点重点记忆HashSet去重依赖hashCode和equalsHashMap底层是数组链表红黑树负载因子0.75扩容为2倍重写equals必须重写hashCodeConcurrentHashMap是线程安全的HashMap下一步预告Day14我们将学习IO流与文件操作——字节流、字符流、缓冲流、序列化等。互动话题HashMap是面试必问题你被问过哪些HashMap的面试题欢迎在评论区分享如果这篇文章对你有帮助欢迎点赞、收藏这是【JavaSE全面教学】系列的第13篇关注我看完整套教程本文为【JavaSE全面教学】系列第13篇持续更新中…

相关文章:

【JavaSE全面教学】Java集合框架下Day13(2026年)

写在前面:这是JavaSE系列的第13篇。上一篇讲了List家族,今天来讲Set和Map。HashMap是面试中问得最多的集合类,底层原理必须搞懂。建议收藏,反复看。 文章目录 一、Set集合:不可重复1.1 Set的特点1.2 HashSet1.3 Linked…...

Kubernetes核心知识点

1.ca-certificates,gnupg,lsb-release三个包的解释. ca-certificates是系统内置的权威根整数数据包,可以让系统正常识别并信任各类网站,避免出现证书异常与访问失败问题。 gnupg是开源的加密与签名校验工具,可用于导入第三方软件源公钥&#…...

战略咨询全新定位:结合政策导向规划企业中长期路径

在新形势下、战略咨询的定位逐渐向结合国家政策导向转变和企业在制定中长期发展路径时、须关注政策变化市场动态。在这一背景下政策要素核心在于灵活应对外部环境,企业可以利用定期分析市场动态和政策影响,明确发展方向。结合实际案例与专家观点、这些方…...

2026届最火的六大AI辅助论文网站实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展着,智能内容生成也就是AIGC,正一步步渗透到学术…...

Perplexity新闻搜索失效真相:LLM缓存机制、地域策略与时间戳偏移的三重干扰(内部技术备忘录节选)

更多请点击: https://codechina.net 第一章:Perplexity新闻资讯搜索 Perplexity 是一款以实时性、引用可追溯性和多源聚合为特色的 AI 搜索工具,其“新闻资讯搜索”功能专为技术从业者与研究人员设计,支持按时间范围、可信信源&a…...

加密货币社区 Google 官方邮件钓鱼威胁机理与防御体系研究

摘要 2026 年 5 月,加密货币社区出现依托 Google 官方邮件通道实施的高级钓鱼攻击,比特币开发者 Jameson Lopp 公开预警,该攻击通过伪装系统安全提示、篡改发件人显示名、滥用可信邮件基础设施,使传统安全告警失效,对新…...

瑞萨电子2019年中国市场战略与MCU/SoC产品深度解析

1. 项目概述:一次对特定年份半导体巨头市场策略的深度复盘在半导体这个日新月异的行业里,每年各大厂商的产品发布和市场策略,都像是一张张精心绘制的航海图,指引着下游应用市场的技术风向。今天,我想和大家深入聊聊一个…...

诺丽果汁终极选购指南——五大品牌全维度对比

我们聊过挑选诺丽果汁需要“看出身、看真材、看底牌”三大原则。今天,我们把这套标准真正落到实处,对市场上最具代表性的五个品牌——艾多美、美商大溪地、可可椰、美乐家、合百诺丽进行全维度对比,帮你看清每家的真实水平。快速结论放在最前…...

数据结构:2.时间复杂的和空间复杂度

【目标】1.如何衡量一个算法的好坏2.复杂度3.算法效率1.如何衡量一个算法的好坏?1.1 两大核心指标(理论层面)指标问的问题表示法例子时间复杂度数据量增大,耗时怎么增长?大O表示法O(n) 比 O(n) 好空间复杂度数据量增大…...

Perplexity体验真相曝光:92%用户忽略的3个隐藏缺陷及2024最新优化方案

更多请点击: https://intelliparadigm.com 第一章:Perplexity用户评论汇总 主流平台高频反馈主题 用户在Reddit、Product Hunt及App Store等平台对Perplexity的评价呈现显著两极分化:专业用户高度认可其引用溯源能力与无幻觉回答质量&#…...

转行对谈:转向AI是破茧成蝶还是折翼未来?

01前言|AI时代下的土建人 一、AI浪潮:开启一个崭新的时代 人工智能(AI)已经从学术前沿走向产业中心,成为当前时代最具颠覆性的技术之一。从最早“出圈”的对话式模型ChatGPT的火爆到AI绘画、AI写作等AIGC(生…...

【无人机协同】联合优化无人机轨迹、发射功率与地面用户-MEC关联的多无人机多地面用户系统 附matlab代码✅

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室👇 关注我领取海量m…...

Perplexity本地化查询实战:手把手教你用Ollama+Llama3构建离线知识库(含性能压测数据)

更多请点击: https://intelliparadigm.com 第一章:Perplexity本地服务查询 Perplexity 本地服务查询是指在不依赖云端 API 的前提下,通过本地部署的模型与推理服务(如 Ollama、LM Studio 或 Text Generation WebUI)完…...

STM32串口转RS-485双机通信:硬件设计、软件驱动与调试全解析

1. 项目概述:从串口到485,双机通信的工业级实现搞嵌入式开发,尤其是用STM32做控制,串口通信(UART)绝对是绕不开的基础。但如果你想把两个STM32板子连起来,距离稍微远一点,或者环境里…...

前端开发从入门到精通:Vue3+TypeScript实战教程

一、为什么软件测试从业者要学Vue3TypeScript在软件测试领域,尤其是自动化测试和性能测试方向,懂前端开发技术早已不是加分项,而是必备技能。作为测试从业者,掌握Vue3TypeScript能为你的职业发展带来多重优势:&#xf…...

从零构建嵌入式Linux平板:基于全志H3与Qt5的实战指南

1. 项目概述:为什么我们要自己动手做一块“平板”?几年前,我在一个嵌入式展会上看到一块工业平板,功能简单但价格不菲。当时我就在想,它的核心无非就是一块屏幕、一个主控板和一个定制的用户界面。既然我们有开源的Lin…...

从FM收音机到5G基站:拆解DDS技术如何悄悄改变我们的通信设备

从FM收音机到5G基站:拆解DDS技术如何悄悄改变我们的通信设备 上世纪90年代,当人们第一次在车载收音机上按下"自动搜台"按钮时,很少有人意识到这个流畅体验背后隐藏着一项革命性技术——直接数字频率合成(DDS&#xff09…...

RK3568开发板TB-96AI-3568CE深度评测:从核心接口到AI应用实战

1. 从芯片到板卡:TB-96AI-3568CE的设计哲学当一块芯片从图纸走向现实,成为一块可以握在手中的开发板时,这中间的路程远不止是简单的引脚引出和电源接通。我接触过不少基于RK3568的方案,但拿到贝启科技这块TB-96AI-3568CE时&#x…...

2025届学术党必备的五大AI学术助手解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能技术飞速发展着,学术不端行为也呈现出了新的挑战,知网身为国…...

国内用户怎么注册.ai域名?2026最新AI域名注册规则+平台推荐

随着人工智能(AI)行业的持续爆发,越来越多企业在搭建官网时,开始优先选择 .ai域名。 你会发现一个明显变化: 👉 很多AI工具、AI平台,直接使用“.ai”作为网站后缀 这背后的原因,其…...

Spring AI 快速对接 AI 大模型(开箱即用)

一、项目准备&#xff08;最简依赖&#xff09;1. 创建 Spring Boot 项目推荐版本&#xff1a;Spring Boot 3.2.x JDK 版本&#xff1a;172. pom.xml 核心依赖<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.o…...

家长选择赶考小状元AI自习室还是其他品牌对孩子学习更有帮助?深度解析三大维度

随着教育智能化浪潮席卷而来&#xff0c;家长们在为孩子选择学习辅助工具时&#xff0c;面临着前所未有的多元选择。传统网课、新兴自习室品牌层出不穷&#xff0c;而深耕智能教育领域二十年的赶考小状元AI智能自习室&#xff0c;以其独特的“教育内核科技工具运营支持”三维融…...

ClaudeCodeOpenAI Token免费使用

2000万claude ops4.7 以及openai gpt5.5 token免费使用apikey贴在这里了:ops4.7sk-119f6d1b81af70e6018f5cf6eb6309261857c98a22280f27345a073c12560e2fgpt5.5sk-b013d9140497d3c7af94459a41f189e4013994f1fe8bac3d5a839e4bcf4413a9使用指南和文档在apikeyfun.com...

Adams新手避坑指南:从几何点、Marker坐标系到立方体,这些基础元素你真的用对了吗?

Adams新手避坑指南&#xff1a;几何元素背后的工程逻辑与实战陷阱 刚接触Adams的工程师常会陷入一个误区——把软件操作手册当作圣经&#xff0c;却忽略了每个几何元素背后的物理意义和工程逻辑。这种"知其然不知其所以然"的学习方式&#xff0c;往往会导致仿真结果失…...

[实测可用 v2.7.5] 桌面端 Open Claw 搭建流程全程图文教程

前言 2026 年开源圈热门的「数字员工」OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标突破 28 万&#xff0c;凭借本地运行 零代码操作 自动干活的核心优势广受关注&#xff01;很多人误以为它是普通聊天 AI&#xff0c;实则是能真正操控电脑的自动化神…...

从A/B测试到临床实验:避开P值陷阱的5个实战要点(含单尾/双尾选择指南)

从A/B测试到临床实验&#xff1a;避开P值陷阱的5个实战要点&#xff08;含单尾/双尾选择指南&#xff09; 在数据驱动的决策时代&#xff0c;P值已成为产品迭代和医学研究中的"通行货币"。当A/B测试报告显示"P<0.05"时&#xff0c;团队往往迫不及待地全…...

创业公司如何设计有效的OKR

创业公司如何设计有效的OKR 前言 创业第一年&#xff0c;我们没有明确的目标&#xff0c;大家都很忙&#xff0c;但不知道忙什么。每个人都在做事&#xff0c;但好像没有形成合力。 后来我开始研究 OKR&#xff08;Objectives and Key Results&#xff09;&#xff0c;发现这不…...

SAP PP实战解析:MPS(主生产计划)如何成为供需平衡的“定海神针”?

1. 为什么企业需要MPS这根"定海神针"&#xff1f; 想象一下你正在经营一家汽车制造厂。周一销售部突然接到500辆车的加急订单&#xff0c;周三又被告知原定300辆的订单要取消。如果直接根据这些波动安排生产&#xff0c;车间可能周一忙到通宵&#xff0c;周三却闲置停…...

ARM中断机制深度解析:从硬件原理到实战调试与RTOS应用

1. 项目概述&#xff1a;从一行代码到硬件响应“ARM体系架构处理器的中断程序分析”这个标题&#xff0c;对于很多嵌入式开发者和系统软件工程师来说&#xff0c;就像一把钥匙。它指向了连接软件逻辑与硬件实时响应的核心枢纽。我处理过太多因为中断没玩明白而导致的系统“玄学…...

当贝盒子H5 64G版618首销TOP1!多平台登顶,凭什么这么火?

2026年5月14日&#xff0c;当贝官方发布了618抢先购首日当贝盒子H5 64G版的首销战报。据官方数据显示&#xff0c;这款重磅升级的电视盒子在京东、天猫、抖音三大主流电商平台的电视盒子类目热销榜中&#xff0c;全部拿下TOP1席位&#xff0c;成为今年618大促第一天的现象级爆款…...