Java Map双列集合深度解析:HashMap、LinkedHashMap、TreeMap底层原理与实战应用

Java Map双列集合深度解析:HashMap、LinkedHashMap、TreeMap底层原理与实战应用


一、Map双列集合概述

1. 核心特点

  • 键值对结构:每个元素由键(Key)和值(Value)组成。
  • 键唯一性:键不可重复,值可重复。
  • 键值映射:每个键对应唯一的值,通过键可快速定位值。

2. 常见实现类

实现类特点底层数据结构
HashMap无序、键唯一、查询高效数组+链表/红黑树(JDK8+)
LinkedHashMap有序(插入/访问顺序)、键唯一哈希表+双向链表
TreeMap可排序(自然/自定义)、键唯一红黑树

二、Map接口核心方法

方法说明
V put(K key, V value)添加键值对,返回旧值(若键存在)
V remove(Object key)根据键删除键值对,返回删除的值
boolean containsKey(Object)判断是否包含指定键
Set<K> keySet()返回所有键的Set集合
Collection<V> values()返回所有值的Collection集合
Set<Entry<K,V>> entrySet()返回所有键值对的Entry集合

三、Map遍历方式详解

1. 键找值遍历

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
for (String key : map.keySet()) {System.out.println(key + ":" + map.get(key));
}

2. 键值对遍历(Entry)

for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + "=" + entry.getValue());
}

3. Lambda表达式遍历(JDK8+)

map.forEach((key, value) -> System.out.println(key + "->" + value));

四、核心实现类详解

1. HashMap

底层原理
  • JDK8前:数组 + 链表。
  • JDK8+:数组 + 链表 + 红黑树(链表长度≥8且数组长度≥64时触发树化)。
  • 哈希冲突解决:链地址法(冲突元素形成链表或树)。
扩容机制
  • 默认初始容量:16。
  • 加载因子:0.75(容量达到75%时扩容为2倍)。
代码示例
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("Java", 1);
hashMap.put("Python", 2);
System.out.println(hashMap.get("Java")); // 输出1

2. LinkedHashMap

核心特点
  • 有序性:默认按插入顺序,可配置为访问顺序(LRU缓存)。
  • 性能:遍历效率高于HashMap,但插入和删除略慢。
代码示例
LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<>();
linkedMap.put("First", 1);
linkedMap.put("Second", 2);
// 输出顺序固定为插入顺序:First=1, Second=2

3. TreeMap

排序规则
  • 自然排序:键需实现Comparable接口。
  • 比较器排序:通过Comparator自定义规则。
代码示例
// 按字符串长度排序
TreeMap<String, Integer> treeMap = new TreeMap<>((s1, s2) -> s1.length() - s2.length()
);
treeMap.put("Apple", 3);
treeMap.put("Banana", 6);
// 输出顺序:Apple(5) → Banana(6)

五、补充知识点

1. HashMap vs Hashtable

特性HashMapHashtable
线程安全非线程安全线程安全(同步)
Null键/值允许不允许
性能更高较低

2. 并发场景下的Map选择

  • ConcurrentHashMap:分段锁或CAS(JDK8+),高并发性能优于Hashtable。

3. Properties类

  • 用途:专门处理属性文件(.properties)。
  • 方法load()读取文件,store()写入文件。

4. 红黑树特性

  • 自平衡二叉查找树,确保增删改查时间复杂度为O(log n)
  • 规则:根节点黑、叶子节点黑、红节点子节点必黑、任意路径黑节点数相同。

六、应用场景总结

场景推荐实现类
高频查询,无需顺序HashMap
需保留插入/访问顺序LinkedHashMap
需键排序(自然/自定义)TreeMap
线程安全需求ConcurrentHashMap

七、常见面试题

  1. HashMap如何解决哈希冲突?
    链地址法:冲突元素以链表或红黑树形式存储。

  2. LinkedHashMap如何实现LRU缓存?
    构造函数设置accessOrder=true,重写removeEldestEntry()控制淘汰策略。

  3. TreeMap的排序规则如何自定义?
    实现Comparator接口或键实现Comparable接口。

  4. HashMap为什么线程不安全?
    多线程扩容可能导致链表成环,引发死循环(JDK8已优化,但仍需同步控制)。


关注博主,获取更多Java集合框架与并发编程深度解析!

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

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

相关文章

HOW - React NextJS 的同构机制

文章目录 一、什么是 Next.js 的同构&#xff1f;二、核心目录结构三、关键函数&#xff1a;如何实现不同渲染方式&#xff1f;1. getServerSideProps —— 实现 SSR&#xff08;每次请求动态获取数据&#xff09;2. getStaticProps getStaticPaths —— 实现 SSG&#xff08;…

SkyWalking的工作原理和搭建过程

SkyWalking 是一个开源的 应用性能监控系统&#xff08;APM&#xff09;&#xff0c;专为云原生、微服务架构设计。其核心原理基于 分布式追踪&#xff08;Distributed Tracing&#xff09;、指标收集&#xff08;Metrics Collection&#xff09; 和 日志关联&#xff08;Log C…

软考 系统架构设计师系列知识点之杂项集萃(57)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;56&#xff09; 第93题 美国著名的卡内基梅隆大学软件工程学研究所针对软件工程的工程管理能力与水平进行了充分研究&#xff0c;提出了5级管理能力的模式&#xff0c;包括临时凑合阶段、简单模仿…

Java 泛型与类型擦除:为什么解析对象时能保留泛型信息?

引言&#xff1a;泛型的“魔术”与类型擦除的困境 在 Java 中&#xff0c;泛型为开发者提供了类型安全的集合操作&#xff0c;但其背后的**类型擦除&#xff08;Type Erasure&#xff09;**机制却常常让人困惑。你是否遇到过这样的场景&#xff1f; List<String> list …

【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总

HTTP/2协议特点 gRPC基于HTTP/2协议&#xff0c;原因&#xff1a; 多路复用&#xff1a;允许在同一个TCP连接上并行传输多个请求和响应&#xff0c;即多个gRPC调用可以通过同一个连接同时进行&#xff0c;避免了HTTP/1.x中常见的线头阻塞问题&#xff0c;减少了连接建立和关闭…

PCIe Switch 问题点

系列文章目录 文章目录 系列文章目录完善PCIe Retimer Overview Document OutlineSwitch 维度BroadComMicroChipAsmedia 祥硕Cyan其他 完善 Functional block diagram&#xff0c;功能框图Key Features and Benefits&#xff0c;主要功能和优点Fabric 链路Multi-root PCIe Re…

vue复杂数据类型多层嵌套的监听

vue复杂数据类型多层嵌套的监听 本来看前辈的做法是watch的嵌套&#xff0c;遇到这种复杂的数据结构还是不多&#xff0c;分享一下前辈的做法 let stopChildWatchList [] // 用于存放每个子监听器watch(() > data,(val) > {// 清除旧监听stopChildWatchList.forEach(…

来一个复古的技术FTP

背景 10年前的老代码&#xff0c;需要升级springboot框架&#xff0c;在升级过程中&#xff0c;测试业务流程里&#xff0c;有FTP的下载业务&#xff0c;不管测试环境如何测试&#xff0c;都没有成功&#xff0c;最后只能自己搭建一个FTP服务器&#xff0c;写一个ftp-demo来测试…

MyBatis-Flex配置Druid(德鲁伊数据库连接池):Spring Boot 3 集成 MyBatis-Flex 配置 Druid 连接池指南

Spring Boot 3 集成 MyBatis-Flex 配置 Druid 连接池指南 前言 本文详细讲解在 Spring Boot 3 项目中集成 MyBatis-Flex 框架后&#xff0c;如何正确配置 Druid 数据库连接池。针对开发者常见的配置缺失导致启动失败的场景&#xff0c;提供完整的解决方案和原理分析。 前置知识…

安全生产调度管理系统的核心功能模块

安全生产调度管理系统是运用现代信息技术构建的智能化管理平台&#xff0c;旨在实现生产安全风险的全面管控和应急资源的优化调度。该系统通过整合物联网、大数据、人工智能等前沿技术&#xff0c;建立起覆盖风险监测、预警预测、指挥调度、决策支持的全链条安全管理体系。 一…

桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题

目录 环境 现象 原理及解决办法 环境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的开发板&#xff0c;DB870CC1A 现象 连接安卓手机时并不会出现该现象&#xff0c;两个开发板都可以当做键盘给手机发按…

JavaScript - JavaScript 运算符之圆括号运算符与方括号运算符(圆括号运算符概述、圆括号运算符用法、方括号运算符概述、方括号运算符用法)

一、圆括号运算符概述 圆括号运算符&#xff08;()&#xff09;主要用于函数调用、表达式分组、多种语法结构登 二、圆括号运算符用法 调用函数 function greet() {console.log("Hello!"); }greet();# 输出结果Hello!当箭头函数有多个参数或零个参数时需要括号 c…

AG-UI 协议:重构多模态交互,开启智能应用新纪元

一、协议诞生的时代背景&#xff1a;填补 AI 生态最后一块拼图 在人工智能技术飞速发展的今天&#xff0c;AI 代理&#xff08;Agent&#xff09;作为能够主动执行复杂任务的智能实体&#xff0c;正从实验室走向生产环境&#xff0c;重塑各个行业的工作流程。然而&#xff0c;…

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…

如何同时管理不同平台的多个账号?

在当今数字营销、电商运营、跨境贸易盛行的时代&#xff0c;同时管理多个平台的账号几乎成了从业者的标配。无论是做社媒营销的广告主&#xff0c;还是操作亚马逊、eBay、Shopee 等平台的跨境卖家&#xff0c;多账号运营都是提升曝光、分散风险、扩大收益的重要方式。 然而&am…

STM32外设AD/DA-基础及CubeMX配置

STM32外设AD/DA-基础及CubeMX配置 一&#xff0c;什么是AD/DA二&#xff0c;基础概念1&#xff0c;模拟 vs 数字2&#xff0c;AD转换1&#xff0c;分辨率 (Resolution)2&#xff0c;参考电压 (Reference Voltage, Vref)3&#xff0c;采样率 (Sampling Rate) 3&#xff0c;DA转换…

【软考 霍夫曼编码的文档压缩比】

霍夫曼编码的文档压缩比计算基于字符频率的最优编码分配&#xff0c;以下是详细步骤及相关案例&#xff1a; 一、压缩比计算公式 [ \text{压缩比} \frac{\text{压缩前总比特数}}{\text{压缩后总比特数 编码表存储开销}} ] 通常以 比率&#xff08;如 3:1&#xff09; 或 百分…

关闭VSCode 自动更新

参考&#xff1a;关闭VSCode 自动更新_vscode关闭自动更新-CSDN博客 vscode的设置 Update: Mode Update: Enable Windows Background Updates Extensions: Auto Check Updates Extensions: Auto Update

Flask框架搭建

1、安装Flask 打开终端运行以下命令&#xff1a; pip install Flask 2、创建项目目录 在Windows上&#xff1a; venv\Scripts\activate 执行 3、创建 app.py 文件 可以在windows终端上创建app.py文件 &#xff08;1&#xff09;终端中创建 使用echo命令 echo "fr…

5G-A和未来6G技术下的操作系统与移动设备变革:云端化与轻量化的发展趋势

目录 5G技术带来的革命性变革 云端化操作系统的实现路径 完全云端化模式 过渡性解决方案 未来操作系统的发展方向 功能架构演进 安全机制强化 移动设备的形态变革 终端设备轻量化 物联网设备简化 实施挑战与应对策略 技术挑战 商业模式创新 总结与展望 5G技术作为…