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

Java Map 集合详解:基础用法、常见实现类与高频面试题解析

在 Java 集合框架中,Map 是用于存储键值对(Key-Value)的重要接口,广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性,并结合代码示例和高频面试问题,帮助你深入理解 Map 的用法。


👉👉👉点击获取2024Java学习资料

1. 什么是 Map?

Map 是 Java 集合框架中的接口,用于存储键值对,其中每个键(Key)是唯一的,而值(Value)则可以重复。

Map 的特点:

  1. 键唯一,值可以重复。
  2. 无序,或者根据具体实现类有不同的排序规则。
  3. 提供快速查找、插入和删除操作。

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

LinkedHashMapHashMap 的子类,它通过链表维护了键值对的插入顺序。

特点

  • 有序存储:按照键值对插入的顺序存储。
  • 性能较高:与 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 的高频问题

  1. HashMap 和 Hashtable 的区别

    • HashMap 是非线程安全的,Hashtable 是线程安全的。
    • HashMap 允许 null 键和 null 值,Hashtable 不允许。
  2. HashMap 的底层实现

    • 基于数组和链表(JDK 1.7)或数组和红黑树(JDK 1.8 之后)。
    • 使用哈希算法来计算键的存储位置。
  3. ConcurrentHashMap 的优势

    • 采用分段锁机制,减少锁的粒度。
    • 提高了高并发下的性能。
  4. TreeMap 和 HashMap 的区别

    • TreeMap 是有序的,HashMap 是无序的。
    • TreeMap 的插入和查找时间复杂度为 O(log n),而 HashMap 为 O(1)。

5. 总结

Map 是 Java 集合框架中不可或缺的一部分,其实现类适用于不同的场景。掌握 Map 的基本操作、实现类特点以及常见的面试问题,不仅有助于日常开发,也能帮助你在面试中脱颖而出。

希望本文对你理解 Map 集合有所帮助!

相关文章:

Java Map 集合详解:基础用法、常见实现类与高频面试题解析

在 Java 集合框架中&#xff0c;Map 是用于存储键值对&#xff08;Key-Value&#xff09;的重要接口&#xff0c;广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性&#xff0c;并结合代码示例和高频面试问题&#xff0c;帮助你深入理解 Map 的用…...

一款基于.Net方便、快捷的数据库文档查询、生成工具

项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持SqlServer数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广益和不断改进&#xff0c;又陆续支持Word、Excel、PDF、Html、Xml、Json、MarkDown等文档格式的导出。同时又…...

Linux平台下实现的小程序-进度条

目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n&#xff1a;换行回车&#xff08;\r&#xff1a;回车&#xff09; 2.缓冲区 如下图在vim编辑器中的命令模式下…...

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络&#xff0c;因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要权限&#xff0c;使用sudo vim或者其他编辑器&#xff0c;修改后的内容如下&#xff1a; # Let NetworkManager manage all devices on …...

解决virtualbox出现开启DHCP之后ubuntu虚拟机之后IP重复的问题

找遍了国内论坛&#xff0c;没一个能解决该问题的&#xff0c;所以我自己写个文章吧&#xff0c;真讨厌那些只会搬运的&#xff0c;污染国内论坛环境&#xff0c;搜一个问题&#xff0c;千篇一律。 问题 操作系统版本为"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…...

Java开发工具-Jar命令

Java开发工具-Jar 1、jar命令全平台使用 2、jar命令的作用 为类和资源创建存档&#xff0c;并从存档中操作或恢复单个类或资源 3、摘要 jar [OPTION …] [ [–release VERSION] [-C dir] files] … 4、jar命令描述 jar命令通常作为用于压缩与解压的工具&#xff0c;基于ZIP或Z…...

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中&#xff0c;控制材质的参数值和向量值...

敖行客年终总结-AT Work 1.0发布

2024年就要过去了&#xff0c;看看敖行客这一年都干了些啥&#xff1f; 敖行客团队通过整整一年的努力&#xff0c;正式推出了AT Work 1.0订阅版&#xff0c;这也标志着AT Work即将正式和C端的小伙伴见面了。 AT Work 是什么&#xff1f; 长期以来&#xff0c;软件研发成本、…...

线程锁和协程锁的区别

转自&#xff1a;chatgpt 1.bthread_mutex_t bthread_mutex_t 是 brpc 框架提供的一种互斥锁&#xff0c;专门为 bthread&#xff08;轻量级线程&#xff09; 设计&#xff0c;具有以下特点&#xff1a; 适用于 bthread 调度模型&#xff1a; bthread_mutex_t 是为 brpc 中的…...

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…...

掌握大数据处理利器:Flink 知识点全面总结【上】

1.Flink的特点 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行状态计算。 Flink主要特点如下&#xff1a; 高吞吐和低延迟。每秒处理数百万个事件&#xff0c;毫秒级延迟。结果的准确性。Flink提供了事件时间(event--time)和处理时间(proces…...

人工智能知识分享第四天-线性回归

线性回归 线性回归介绍 线性回归概念 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 注意事项&#xff1a; 1 为什么叫线性模型&#xff1f;因为求解的w&#xff0c;都是w的零次幂&am…...

Appium 2.0:移动自动化测试的革新之旅

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在移动应用开发的领域中&#xff0c;Appium 作为一款强大的自动化测试工具&#xf…...

牛客网最新1129道 Java 面试题及答案整理

前言 面试&#xff0c;跳槽&#xff0c;每天都在发生&#xff0c;而对程序员来说"金三银四"更是面试和跳槽的高峰期&#xff0c;跳槽&#xff0c;更是很常见的&#xff0c;对于每个人来说&#xff0c;跳槽的意义也各不相同&#xff0c;可能是一个人更向往一个更大的…...

Swift Combine 学习(六):自定义 Publisher 和 Subscriber

Swift Combine 学习&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 学习&#xff08;二&#xff09;&#xff1a;发布者 PublisherSwift Combine 学习&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 学习&#xff08;四&…...

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,// 命名路由 &#xff0c;跳转<router-link :to"{ name: forgetPsdr, params: { userId: 123 }}&q…...

java AQS

什么是AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是 Java 中并发控制的一种机制&#xff0c;位于 java.util.concurrent.locks 包下&#xff0c;它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...

L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)

目录 1.题目 2.三种常规解法 方法1:递归做 ​编辑 方法2:改用循环做 初写的代码 提交结果 分析 修改后的代码 提交结果 for循环的其他写法 提交结果 方法3:循环数组 提交结果 3.方法4:矩阵 算法 代码实践 1.先计算矩阵n次方 2.后将矩阵n次方嵌入递推式中 提…...

sdut-C语言实验-合数分解

sdut-C语言实验-合数分解 分数 12 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 合数是指在大于1的整数中&#xff0c;除了1和本身外&#xff0c;还能被其他数整除的数。‌例如&#xff0c;4、6、8、9、10等都是合数。把一个合数分解成若干个质因数乘积的形式(即求质因…...

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域&#xff0c;pytest 是当之无愧的王者。提到 pytest&#xff0c;不得不说它的一大核心功能——Fixture。Fixture 的强大&#xff0c;让复杂的测试流程变得井井有条&#xff0c;让测试代码更加灵活和可复用。 那么&#xff0c;pytest 的 Fixture 究竟是…...

赶Due救急必看!从飙红到安全线:5款降AI工具红黑榜与免费指令微调法

为了找到真正靠谱的解决方案&#xff0c;我过去测试了市面上大部分号称能降低ai率的方法。从一分钱不花的模型指令&#xff0c;到各种付费的专业降ai率工具&#xff0c;用手头的文本做了几十次实操对比。说心里话&#xff0c;里面套路确实不少&#xff0c;有些方法用完后语句颠…...

【干货】如何从软件测试转型为AI测试开发?这份面试题指南值得你一看!

你是软件测试从业者&#xff0c;但想转向人工智能测试开发岗位吗&#xff1f; AI 测试岗位不仅考察传统测试技能&#xff0c;还要求你理解 AI/ML 模型特性、设计测试流程、编写自动化脚本。 今天&#xff0c;我们整理了一份面试题&#xff0c;从基础概念到实战场景&#xff0…...

你的动漫图片为什么总是不够清晰?3个步骤让AI帮你还原4K级画质

你的动漫图片为什么总是不够清晰&#xff1f;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 数据通路与控制器的"双人舞" &#x1f4da; 本文内容摘自本人的开源书《从沙子到车辙 - 一个工程师的理解》 &#x1f517; 在线阅读/下载&#xff1a;from-sand-to-ruts git clone https://github.com/Lularible/from-sand-to-ruts⭐ 如果对您有帮助&#xf…...

一键切换语境+保留术语一致性+上下文感知翻译,Perplexity翻译查询功能的3大颠覆性能力,现在不用就落后了

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity翻译查询功能的全景概览 Perplexity 的翻译查询功能并非传统意义上的“文本翻译器”&#xff0c;而是一种融合语义理解、上下文感知与多语言知识检索的智能问答增强机制。它允许用户以任意自然语言…...

联想RD450X服务器风扇策略深度解析:IPMI raw命令详解与安全调校指南

联想RD450X服务器IPMI风扇调校实战&#xff1a;从底层指令到安全优化 在数据中心密集部署的服务器集群中&#xff0c;散热管理往往成为平衡性能与可靠性的关键支点。联想RD450X作为主流2U机架式服务器&#xff0c;其智能风扇控制系统通过IPMI接口提供了丰富的底层调节能力&…...

你还在手动切Relax Mode?3行Discord Bot脚本自动识别任务优先级并智能分流——附GitHub可运行代码

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Relax Mode的本质与Discord任务分流的底层逻辑 Relax Mode并非一种简单的“低负载”开关&#xff0c;而是基于事件驱动与资源感知的动态调度策略。其核心在于将非实时性、可延迟、可重试的后台任务&…...

从STM32转战合泰HT32F52352:手把手教你用GPTM定时器搞定四路舵机PWM控制

从STM32到HT32F52352的平滑迁移&#xff1a;GPTM定时器实现四路舵机PWM控制实战 对于习惯了STM32生态的开发者而言&#xff0c;初次接触合泰HT32系列MCU时往往面临两个挑战&#xff1a;如何快速理解新芯片的架构设计&#xff0c;以及如何将已有的STM32开发经验有效迁移。HT32F…...

正交试验结果怎么看?一张图教你读懂SPSSAU的极差分析表和均值图

正交试验结果解读指南&#xff1a;从极差分析到最优组合决策 正交试验作为多因素优化研究的利器&#xff0c;其价值往往在数据解读阶段才能真正释放。当SPSSAU输出的极差分析表和均值图呈现在眼前时&#xff0c;许多研究者会陷入"数字迷宫"——那些K1/K2/K3值究竟在诉…...

RK3576+Hailo-8异构计算:破解高帧率摄像头实时AI分析算力瓶颈

1. 项目概述&#xff1a;从“看得见”到“看得懂”的实时化挑战最近在折腾一个智能安防的项目&#xff0c;客户提了个听起来简单但做起来挠头的要求&#xff1a;他们希望摄像头不仅能24小时不间断录像&#xff0c;还要能“实时”分析画面里发生的事——比如识别出有人闯入、车辆…...