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 究竟是…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
