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 集合有所帮助!

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

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

相关文章

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug&#xff0c;操作体验与 VSCode 一致。 优势 执行效率高&#xff0c;不掉帧 可随时开启 配置简单&#xff0c;一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本&#xff08;注&#xff1a;从 Sublime 3 升到 4 的不算&#xff0c;…

光伏电站发电量提升秘籍

在如今这个倡导清洁能源的时代&#xff0c;光伏电站成为了不少人的选择。但怎样才能让自家的光伏电站发电量更高呢&#xff1f;下面就给大家分享几个实用方法。 一、光伏组件的选择与安装角度至关重要。优质的光伏组件转换效率更高&#xff0c;像单晶硅组件就比多晶硅组件在转…

pytorch 计算图中的叶子节点介绍

1. 什么是叶子节点&#xff1f; 在 PyTorch 的自动微分机制中&#xff0c;叶子节点&#xff08;leaf node&#xff09; 是计算图中&#xff1a; 由用户直接创建的张量&#xff0c;并且它的 requires_gradTrue。这些张量是计算图的起始点&#xff0c;通常作为模型参数或输入变…

flux文生图模型实践

flux文生图模型实践 flyfish https://github.com/black-forest-labs/flux Black Forest Labs发布FLUX.1 Tools&#xff0c;这是一套模型全家桶&#xff0c;旨在为FLUX.1基础文本转图像模型添加控制和可操纵性&#xff0c;从而实现对真实图像和生成图像的修改和重新创建。FLU…

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay

Android Room 框架的初步使用

一、简介 Room 是一个强大的对象关系映射库&#xff0c;它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象&#xff08;称为实体&#xff09;上。你可以使用简单的注解&#xff08;如 Entity、Dao 和 Database&#xff09;来定义数据库表、数据访问对象&#xff08…

UCAS 24秋网络认证技术 CH15 Kerberos复习

Key Distribution Center-KDC 基本流程可分为两大部分&#xff1a;初始认证 和 服务票据获取与使用。 初始认证 Authenticate&#xff1a;客户端向认证服务器&#xff08;Authentication Server&#xff0c;AS&#xff09;发送请求以验证身份。Receive TGT&#xff1a;AS 验证…

字符串模糊匹配-TheFuzz

TheFuzz: 模糊字符串匹配的利器 在日常编程任务中&#xff0c;我们经常需要处理字符串的匹配问题&#xff0c;比如判断两个字符串是否相似、从列表中找到最接近的字符串等。而TheFuzz库&#xff08;前身为fuzzywuzzy&#xff09;就是为了解决这些问题而生的。本文将介绍TheFuz…

C++ 设计模式:职责链模式(Chain of Responsibility)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 组合模式 链接&#xff1a;C 设计模式 - 迭代器模式 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象都有机会处理请求&#xff0c;从而避免请求…

摄像头监视脚本

摄像头监视脚本&#xff0c;若检测到摄像头画面有变化&#xff0c;保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…

Edge如何获得纯净的启动界面

启动Edge会出现快速链接&#xff0c;推广链接&#xff0c;网站导航&#xff0c;显示小组件&#xff0c;显示信息提要&#xff0c;背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…

vscode remote-ssh 免密登录不生效的问题

一、问题 通过公私钥的方式设置免密登录&#xff0c;设置后每次登录仍需要密码 二、解决方法 可能的原因是 文件/文件夹 权限不对&#xff0c;多权限和少权限都不行 /home/$user 和 /home/$user/.ssh 路径必须是 700 权限 /home/$user/.ssh/authorized_key 必须是 600 权限 比…

管理系统中经典审核功能实现

前言 先简单交代和阐述一下业务背景和逻辑&#xff0c;该系统是一个综合类的音乐系统&#xff0c;上传音乐时&#xff0c;逻辑和qq音乐一样&#xff0c;前端页面就能体现出大概逻辑&#xff0c;如下图所示&#xff1a; 专辑和歌曲是密不可分的&#xff0c;而且歌曲的封面就是对…

AI与药学 | ChatGPT 在临床药学中的有效性以及人工智能在药物治疗管理中的作用

《Effectiveness of ChatGPT in clinical pharmacy and the role of artificial intelligence in medication therapy management》这篇文献研究了ChatGPT在临床药学&#xff0c;特别是在药物治疗管理&#xff08;MTM&#xff09;中的有效性。 一、研究背景 (Background) MTM …

《机器学习》——利用OpenCV库中的KNN算法进行图像识别

文章目录 KNN算法介绍下载OpenCV库实验内容实验结果完整代码手写数字传入模型训练 KNN算法介绍 一、KNN算法的基本要素 K值的选择&#xff1a;K值代表选择与新测试样本距离最近的前K个训练样本数&#xff0c;通常K是不大于20的整数。K值的选择对算法结果有重要影响&#xff0c…

css 关于flex布局中子元素的属性flex

css flex布局中子元素的属性flex 1. flex 是 flex-grow、flex-shrink 和 flex-basis 的简写 语法格式&#xff1a; flex: [flex-grow] [flex-shrink] [flex-basis];各属性解析&#xff1a; flex-grow: 子元素如何按比例分配父元素的 剩余空间。 默认值&#xff1a;0&#…

【gopher的java学习笔记】依赖管理方式对比(go mod maven)

什么是go mod go mod是Go语言官方引入的模块管理工具&#xff0c;旨在简化项目依赖管理&#xff0c;提高构建的可重复性和稳定性。以下是关于go mod的详细介绍&#xff1a; 在go mod之前&#xff0c;Go语言主要依赖GOPATH和vendor目录来管理项目依赖。然而&#xff0c;这种方式…

[服务器][教程]Ubuntu24.04 Server开机自动挂载硬盘教程

1. 查看硬盘ID ls -l /dev/disk/by-uuid可以看到对应的UUID所对应的分区 2. 创建挂载文件夹 创建好文件夹即可 3. 修改配置文件 sudo vim /etc/fstab把对应的UUID和创建的挂载目录对应即可 其中# Personal mount points下面的是自己新添加的 &#xff1a;分区定位&#xff…

惠州市政数局局长杨伟斌:惠州市公共数据授权运营模式探索

近期&#xff0c;2024数字资产管理大会召开。会上&#xff0c;惠州市政务服务和数据管理局局长杨伟斌在会上做了题为基于“隐私计算区块链”的惠州市公共数据授权运营模式探索主旨演讲&#xff0c;从三个方面展开&#xff0c;一是建制度汇数据&#xff0c;二是夯基础保安全&…