Java Map 集合详解:基础用法、常见实现类与高频面试题解析
在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用法。
👉👉👉点击获取2024Java学习资料
1. 什么是 Map?
Map 是 Java 集合框架中的接口,用于存储键值对,其中每个键(Key)是唯一的,而值(Value)则可以重复。
Map 的特点:
- 键唯一,值可以重复。
- 无序,或者根据具体实现类有不同的排序规则。
- 提供快速查找、插入和删除操作。
2. Map 的基本操作
以下是 Map 接口的一些常用方法:
| 方法 | 描述 |
|---|---|
put(K key, V value) | 添加或更新键值对 |
get(Object key) | 根据键获取对应的值 |
remove(Object key) | 移除指定键的键值对 |
containsKey(Object key) | 判断是否包含某个键 |
containsValue(Object value) | 判断是否包含某个值 |
size() | 返回键值对的数量 |
isEmpty() | 判断 Map 是否为空 |
keySet() | 返回所有键的集合 |
values() | 返回所有值的集合 |
entrySet() | 返回键值对的集合 |
基础代码示例:
import java.util.*;public class MapDemo {public static void main(String[] args) {// 创建一个 HashMapMap<String, Integer> map = new HashMap<>();// 添加键值对map.put("Java", 1);map.put("Python", 2);map.put("C++", 3);// 获取值System.out.println("Java 的值是: " + map.get("Java"));// 遍历键值对for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}// 检查是否包含某个键或值System.out.println("包含键 Java: " + map.containsKey("Java"));System.out.println("包含值 2: " + map.containsValue(2));// 删除键值对map.remove("Python");System.out.println("删除后: " + map);}
}
3. 常见的 Map 实现类
3.1 HashMap
HashMap 是最常用的 Map 实现类,基于哈希表实现。它允许 null 键和 null 值,且线程不安全。
特点:
- 无序存储:不保证键值对的顺序。
- 高效:查找和插入的时间复杂度为 O(1)。
- 线程不安全:在多线程场景下需要手动同步。
代码示例:
import java.util.HashMap;public class HashMapExample {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(1, "One");map.put(2, "Two");map.put(3, "Three");System.out.println("HashMap: " + map);}
}
3.2 LinkedHashMap
LinkedHashMap 是 HashMap 的子类,它通过链表维护了键值对的插入顺序。
特点:
- 有序存储:按照键值对插入的顺序存储。
- 性能较高:与
HashMap性能接近。
代码示例:
import java.util.LinkedHashMap;public class LinkedHashMapExample {public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(1, "One");map.put(2, "Two");map.put(3, "Three");System.out.println("LinkedHashMap: " + map);}
}
3.3 TreeMap
TreeMap 是基于红黑树实现的 Map,键值对按键的自然顺序(或自定义顺序)进行排序。
特点:
- 有序存储:按键的自然顺序排序。
- 时间复杂度:查找和插入的时间复杂度为 O(log n)。
- 不允许
null键,但可以存储null值。
代码示例:
import java.util.TreeMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<String, Integer> map = new TreeMap<>();map.put("C", 3);map.put("A", 1);map.put("B", 2);System.out.println("TreeMap: " + map);}
}
3.4 Hashtable
Hashtable 是线程安全的 Map,但由于其同步机制,性能较低,已被逐渐淘汰。
特点:
- 线程安全:适合多线程环境。
- 不允许
null键或null值。 - 性能低:比
HashMap慢。
代码示例:
import java.util.Hashtable;public class HashtableExample {public static void main(String[] args) {Hashtable<Integer, String> table = new Hashtable<>();table.put(1, "One");table.put(2, "Two");System.out.println("Hashtable: " + table);}
}
3.5 ConcurrentHashMap
ConcurrentHashMap 是线程安全的 HashMap,采用分段锁机制,性能优于 Hashtable。
特点:
- 线程安全:适合高并发场景。
- 分段锁机制:提高并发性能。
- 不允许
null键或null值。
代码示例:
import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapExample {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("A", 1);map.put("B", 2);System.out.println("ConcurrentHashMap: " + map);}
}
4. 面试中关于 Map 的高频问题
-
HashMap 和 Hashtable 的区别:
HashMap是非线程安全的,Hashtable是线程安全的。HashMap允许null键和null值,Hashtable不允许。
-
HashMap 的底层实现:
- 基于数组和链表(JDK 1.7)或数组和红黑树(JDK 1.8 之后)。
- 使用哈希算法来计算键的存储位置。
-
ConcurrentHashMap 的优势:
- 采用分段锁机制,减少锁的粒度。
- 提高了高并发下的性能。
-
TreeMap 和 HashMap 的区别:
TreeMap是有序的,HashMap是无序的。TreeMap的插入和查找时间复杂度为 O(log n),而HashMap为 O(1)。
5. 总结
Map 是 Java 集合框架中不可或缺的一部分,其实现类适用于不同的场景。掌握 Map 的基本操作、实现类特点以及常见的面试问题,不仅有助于日常开发,也能帮助你在面试中脱颖而出。
希望本文对你理解 Map 集合有所帮助!
相关文章:
Java Map 集合详解:基础用法、常见实现类与高频面试题解析
在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用…...
一款基于.Net方便、快捷的数据库文档查询、生成工具
项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具!从最初仅支持SqlServer数据库、CHM文档格式开始,通过不断地探索开发、集思广益和不断改进,又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式的导出。同时又…...
Linux平台下实现的小程序-进度条
目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n:换行回车(\r:回车) 2.缓冲区 如下图在vim编辑器中的命令模式下…...
Ubuntu 22.04.5 修改IP
Ubuntu22.04.5使用的是netplan管理网络,因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改,需要权限,使用sudo vim或者其他编辑器,修改后的内容如下: # Let NetworkManager manage all devices on …...
解决virtualbox出现开启DHCP之后ubuntu虚拟机之后IP重复的问题
找遍了国内论坛,没一个能解决该问题的,所以我自己写个文章吧,真讨厌那些只会搬运的,污染国内论坛环境,搜一个问题,千篇一律。 问题 操作系统版本为"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…...
Java开发工具-Jar命令
Java开发工具-Jar 1、jar命令全平台使用 2、jar命令的作用 为类和资源创建存档,并从存档中操作或恢复单个类或资源 3、摘要 jar [OPTION …] [ [–release VERSION] [-C dir] files] … 4、jar命令描述 jar命令通常作为用于压缩与解压的工具,基于ZIP或Z…...
UE5通过蓝图节点控制材质参数
通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中,控制材质的参数值和向量值...
敖行客年终总结-AT Work 1.0发布
2024年就要过去了,看看敖行客这一年都干了些啥? 敖行客团队通过整整一年的努力,正式推出了AT Work 1.0订阅版,这也标志着AT Work即将正式和C端的小伙伴见面了。 AT Work 是什么? 长期以来,软件研发成本、…...
线程锁和协程锁的区别
转自:chatgpt 1.bthread_mutex_t bthread_mutex_t 是 brpc 框架提供的一种互斥锁,专门为 bthread(轻量级线程) 设计,具有以下特点: 适用于 bthread 调度模型: bthread_mutex_t 是为 brpc 中的…...
手机租赁平台开发助力智能设备租赁新模式
内容概要 手机租赁平台开发,简单说就是让你用得起高大上的智能设备,不管是最新款的手机、平板,还是那些炫酷的智能耳机,这个平台应有尽有。想要体验但又不希望花大钱?那你就找对地方了!通过灵活的租赁方案…...
掌握大数据处理利器:Flink 知识点全面总结【上】
1.Flink的特点 Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。 Flink主要特点如下: 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。结果的准确性。Flink提供了事件时间(event--time)和处理时间(proces…...
人工智能知识分享第四天-线性回归
线性回归 线性回归介绍 线性回归概念 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 注意事项: 1 为什么叫线性模型?因为求解的w,都是w的零次幂&am…...
Appium 2.0:移动自动化测试的革新之旅
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在移动应用开发的领域中,Appium 作为一款强大的自动化测试工具…...
牛客网最新1129道 Java 面试题及答案整理
前言 面试,跳槽,每天都在发生,而对程序员来说"金三银四"更是面试和跳槽的高峰期,跳槽,更是很常见的,对于每个人来说,跳槽的意义也各不相同,可能是一个人更向往一个更大的…...
Swift Combine 学习(六):自定义 Publisher 和 Subscriber
Swift Combine 学习(一):Combine 初印象Swift Combine 学习(二):发布者 PublisherSwift Combine 学习(三):Subscription和 SubscriberSwift Combine 学习(四&…...
Vue-router知识点汇总
import Vue from vue import Router from vue-router Vue.use(Router) import Layout from /layout export const constantRoutes [{path: /forgetpsd,name: forgetPsd,// 命名路由 ,跳转<router-link :to"{ name: forgetPsdr, params: { userId: 123 }}&q…...
java AQS
什么是AQS AQS(AbstractQueuedSynchronizer,抽象队列同步器)是 Java 中并发控制的一种机制,位于 java.util.concurrent.locks 包下,它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...
L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)
目录 1.题目 2.三种常规解法 方法1:递归做 编辑 方法2:改用循环做 初写的代码 提交结果 分析 修改后的代码 提交结果 for循环的其他写法 提交结果 方法3:循环数组 提交结果 3.方法4:矩阵 算法 代码实践 1.先计算矩阵n次方 2.后将矩阵n次方嵌入递推式中 提…...
sdut-C语言实验-合数分解
sdut-C语言实验-合数分解 分数 12 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 合数是指在大于1的整数中,除了1和本身外,还能被其他数整除的数。例如,4、6、8、9、10等都是合数。把一个合数分解成若干个质因数乘积的形式(即求质因…...
深入理解 pytest Fixture 方法及其应用
在 Python 自动化测试领域,pytest 是当之无愧的王者。提到 pytest,不得不说它的一大核心功能——Fixture。Fixture 的强大,让复杂的测试流程变得井井有条,让测试代码更加灵活和可复用。 那么,pytest 的 Fixture 究竟是…...
赶Due救急必看!从飙红到安全线:5款降AI工具红黑榜与免费指令微调法
为了找到真正靠谱的解决方案,我过去测试了市面上大部分号称能降低ai率的方法。从一分钱不花的模型指令,到各种付费的专业降ai率工具,用手头的文本做了几十次实操对比。说心里话,里面套路确实不少,有些方法用完后语句颠…...
【干货】如何从软件测试转型为AI测试开发?这份面试题指南值得你一看!
你是软件测试从业者,但想转向人工智能测试开发岗位吗? AI 测试岗位不仅考察传统测试技能,还要求你理解 AI/ML 模型特性、设计测试流程、编写自动化脚本。 今天,我们整理了一份面试题,从基础概念到实战场景࿰…...
你的动漫图片为什么总是不够清晰?3个步骤让AI帮你还原4K级画质
你的动漫图片为什么总是不够清晰?3个步骤让AI帮你还原4K级画质 【免费下载链接】Real-ESRGAN Real-ESRGAN aims at developing Practical Algorithms for General Image/Video Restoration. 项目地址: https://gitcode.com/gh_mirrors/re/Real-ESRGAN 想象一…...
从沙子到车辙(3.3):数据通路与控制器的“双人舞“
3.3 数据通路与控制器的"双人舞" 📚 本文内容摘自本人的开源书《从沙子到车辙 - 一个工程师的理解》 🔗 在线阅读/下载:from-sand-to-ruts git clone https://github.com/Lularible/from-sand-to-ruts⭐ 如果对您有帮助…...
一键切换语境+保留术语一致性+上下文感知翻译,Perplexity翻译查询功能的3大颠覆性能力,现在不用就落后了
更多请点击: https://codechina.net 第一章:Perplexity翻译查询功能的全景概览 Perplexity 的翻译查询功能并非传统意义上的“文本翻译器”,而是一种融合语义理解、上下文感知与多语言知识检索的智能问答增强机制。它允许用户以任意自然语言…...
联想RD450X服务器风扇策略深度解析:IPMI raw命令详解与安全调校指南
联想RD450X服务器IPMI风扇调校实战:从底层指令到安全优化 在数据中心密集部署的服务器集群中,散热管理往往成为平衡性能与可靠性的关键支点。联想RD450X作为主流2U机架式服务器,其智能风扇控制系统通过IPMI接口提供了丰富的底层调节能力&…...
你还在手动切Relax Mode?3行Discord Bot脚本自动识别任务优先级并智能分流——附GitHub可运行代码
更多请点击: https://intelliparadigm.com 第一章:Relax Mode的本质与Discord任务分流的底层逻辑 Relax Mode并非一种简单的“低负载”开关,而是基于事件驱动与资源感知的动态调度策略。其核心在于将非实时性、可延迟、可重试的后台任务&…...
从STM32转战合泰HT32F52352:手把手教你用GPTM定时器搞定四路舵机PWM控制
从STM32到HT32F52352的平滑迁移:GPTM定时器实现四路舵机PWM控制实战 对于习惯了STM32生态的开发者而言,初次接触合泰HT32系列MCU时往往面临两个挑战:如何快速理解新芯片的架构设计,以及如何将已有的STM32开发经验有效迁移。HT32F…...
正交试验结果怎么看?一张图教你读懂SPSSAU的极差分析表和均值图
正交试验结果解读指南:从极差分析到最优组合决策 正交试验作为多因素优化研究的利器,其价值往往在数据解读阶段才能真正释放。当SPSSAU输出的极差分析表和均值图呈现在眼前时,许多研究者会陷入"数字迷宫"——那些K1/K2/K3值究竟在诉…...
RK3576+Hailo-8异构计算:破解高帧率摄像头实时AI分析算力瓶颈
1. 项目概述:从“看得见”到“看得懂”的实时化挑战最近在折腾一个智能安防的项目,客户提了个听起来简单但做起来挠头的要求:他们希望摄像头不仅能24小时不间断录像,还要能“实时”分析画面里发生的事——比如识别出有人闯入、车辆…...
