一文带你弄清Map集合及其实现类(适合小白秋招篇)

news2024/12/24 13:30:13

前言:
本篇文章主要讲解Java中的Map集合接口以及相关实现类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始
在这里插入图片描述

文章目录

  • HashMap详细介绍
  • JDK.17和JDK1.8的HashMap有什么区别
    • JDK 1.7的HashMap
    • JDK 1.8的HashMap
  • TreeMap详细介绍

在Java中,Map是一种键值对(Key-Value)的集合。它存储了一组唯一的键与相应的值,每个键可以映射到一个值。

以下是Map接口的一些重要方法:

V get(Object key):返回与指定键相关联的值,如果不存在则返回null。
V put(K key, V value):将指定的键值对存储到Map中,如果键已经存在,则替换对应的值,并返回之前与该键相关联的值;如果键不存在,则直接添加键值对,并返回null。
V remove(Object key):从Map中删除指定键的映射关系,并返回与该键相关联的值,如果键不存在,则返回null。
boolean containsKey(Object key):检查Map是否包含指定的键,如果存在则返回true,否则返回false。
boolean containsValue(Object value):检查Map是否包含指定的值,如果存在则返回true,否则返回false。 int size():返回Map中键值对的数量。
boolean isEmpty():检查Map是否为空,如果为空则返回true,否则返回false。 void
clear():清空Map中的所有键值对。 Set keySet():返回Map中所有键的集合。 Collection
values():返回Map中所有值的集合。 Set<Map.Entry<K, V>> entrySet():返回Map中所有键值对的集合。

常见的实现Map接口的类有:

  • HashMap:基于哈希表实现,提供快速的键值查找和插入操作。不保证键值对的顺序。
  • LinkedHashMap:基于哈希表和双向链表实现,保留插入顺序或访问顺序(可以通过构造函数参数指定)。
  • TreeMap:基于红黑树实现,按照键的自然顺序或者指定的比较器进行排序。
  • Hashtable:早期的实现类,线程安全但效率较低。已经被HashMap取代。
    在这里插入图片描述

HashMap详细介绍

HashMap是Java中的一种数据结构,用于存储键值对。它实现了Map接口,允许我们使用一个特定的键来访问与之关联的值。
在这里插入图片描述

HashMap的实现基于哈希表。在哈希表中,每个元素都有一个唯一的索引(哈希码),这个索引可以用来查找对应的值。当我们向HashMap中添加一个新元素时,它会先计算该元素的哈希码,并将其插入到对应位置上。

以下是HashMap类的主要方法:

put(key, value):将指定的键和值添加到Map中。
get(key):返回指定键所映射的值。
remove(key):从Map中删除指定键及其关联的值。
containsKey(key):判断Map是否包含指定键。
keySet():返回Map中所有键组成的Set集合。

需要注意的几点是:

  • HashMap允许使用null作为key和value。
  • 如果多个元素映射到同一个索引位置上,则会产生冲突。HashMap采用链式存储解决冲突问题,即在相应位置上维护一个链表,将具有相同索引位置的元素串起来。这样,在查找时只需遍历相应链表即可。
    在处理大量数据时,由于哈希碰撞可能会影响性能,因此我们需要选择一个合适的哈希函数来减少碰撞的可能性。
  • HashMap不是线程安全的,如果在多线程环境下使用HashMap,需要进行额外的同步操作。同时Java也提供了线程安全的ConcurrentHashMap类。

JDK.17和JDK1.8的HashMap有什么区别

JDK 1.7和JDK 1.8都提供了HashMap类,但是它们的实现方式有所不同。下面对这两个版本的HashMap做一个详细的介绍:

JDK 1.7的HashMap

JDK 1.7的HashMap是基于数组和链表组合实现的。HashMap中的每个元素都是一个Entry对象,其中包含了一个key-value对和next指针。当我们往HashMap中添加元素时,程序会根据key的hashCode值计算出元素在数组中的位置,如果该位置还没有存放任何元素,那么直接将新元素放入该位置即可。如果该位置已经存在其他元素,那么它们会被当作一个链表存放在该位置上,新元素会被插入到链表的尾部。当遍历HashMap时,程序会首先根据key的hashCode值确定该元素在数组中的位置,然后遍历该位置上的链表,找到对应的Entry对象。

但是,JDK 1.7的HashMap存在一个很严重的问题,就是在多线程环境下,如果多个线程对HashMap进行并发修改,可能会导致链表成环形而死循环,从而引发程序崩溃。因此,在JDK 1.7中,如果需要在多线程下使用HashMap,我们必须手动实现同步机制。

JDK 1.8的HashMap

JDK 1.8的HashMap也是基于数组和链表组合实现的,但是在实现方式上有了较大的改进。JDK 1.8的HashMap采用了红黑树的数据结构来代替链表,这样可以保证在大量元素存储时,当链表长度超过一定阈值时,将链表转换成红黑树,从而提高查找、添加和删除操作的效率。

同时,JDK 1.8的HashMap还针对并发修改问题进行了优化。它使用了一种叫做**“分段锁”**的机制来代替传统的同步锁,将一个大的HashMap切分成多个小的HashMap,每个小的HashMap都由一个独立的锁进行控制,这样多个线程对不同的小HashMap进行修改时,就不会发生死循环的情况了。

除此之外,JDK 1.8的HashMap还引入了一些新的方法,例如forEach()、replaceAll()等,以便我们更加方便地操作HashMap中的元素。此外,JDK 1.8的HashMap对JDK 1.7的问题进行了修复和优化,因此在实际使用中,推荐尽量使用JDK 1.8的HashMap。

TreeMap详细介绍

TreeMap是Java中的一种数据结构,它实现了NavigableMap接口,而NavigableMap接口又继承了SortedMap接口,它能够根据键值进行排序,并且基于红黑树实现。因此,它保证了插入、删除和查找操作的时间复杂度均为O(logN)。
在这里插入图片描述

以下是TreeMap的几个特性:

  • 有序性:TreeMap会根据键的自然顺序或者指定的比较器对键进行排序,并保持有序状态。在插入、删除和查询操作时,TreeMap会保持键的有序性。

  • 唯一键:TreeMap的键是唯一的,不允许重复的键。如果添加的键已经存在,则新值将替代旧值。

  • 快速插入、删除和查询:TreeMap基于红黑树实现,具有快速的插入、删除和查询操作。平均情况下,这些操作的时间复杂度是O(logN),其中N表示键值对的数量。

  • 线程不安全:TreeMap不是线程安全的,如果多个线程同时访问一个TreeMap对象并进行修改操作,可能会导致不确定的结果。如果需要在多线程环境下使用Map,可以考虑使用ConcurrentSkipListMap或通过synchronized关键字保证线程安全

  • 允许null键(仅限于没有指定比较器时):TreeMap允许存储null键。但是需要注意的是,如果在创建TreeMap时指定了比较器,则不允许null键。

我们在使用时需要注意以下几点:

  1. TreeMap允许使用null作为value,但不允许使用null作为key。如果尝试存储null作为key,则会抛出NullPointerException异常
  2. TreeMap默认情况下按照升序排列元素。如果需要改变排序方式,则可以通过提供自定义比较器来实现。例如,我们可以创建一个按照字符串长度降序排列元素的TreeMap:
Map<String, Integer> map = new TreeMap<>((o1, o2) -> o2.length() - o1.length());
  1. 和HashMap一样,TreeMap也不是线程安全的。如果在多线程环境下使用TreeMap,需要进行额外的同步操作。同时Java也提供了线程安全的ConcurrentSkipListMap类

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

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

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

相关文章

【Linux】冯诺依曼体系结构 操作系统 进程概念

目录 一、冯诺依曼体系结构 二、操作系统 1、概念 2、设计OS的目的 三、进程 1、基本概念 2、描述进程-PCB 3、组织进程 4、查看进程和终止 5、通过系统调用获取进程标识符 6、通过系统调用创建进程-fork 7、进程状态 8、特殊进程 8.1 僵尸进程 8.2 孤儿进程 一、冯诺依曼体…

【从零开始学习JAVA | 第八篇】String类

目录 前言&#xff1a; String类&#xff1a; 常见的认识误区&#xff1a; 创建String类&#xff1a; 注意点&#xff1a; 总结&#xff1a; 前言&#xff1a; String类是Java中最常见的一个类&#xff0c;本篇将对Stirng类的各种功能进行详细的介绍&#xff0c;各位小伙伴…

js:使用vue-codemirror实现一个语法高亮的网页代码编辑器

codemirror code editor component for vuejs 译文&#xff1a;vuejs的codemirror代码编辑器组件 文档 https://github.com/surmon-china/vue-codemirror 安装 # 依赖 pnpm install codemirror vue-codemirror --save# 语言 pnpm install codemirror/lang-json --save pnpm …

【VulnHub系列】MyFileServer

因为是从PDF转换过来偶尔可能会出现内容缺少&#xff0c;可以看原版PDF&#xff1a;有道云笔记 实验环境 Kali&#xff1a;192.168.10.102 MyFileServer&#xff1a;192.168.10.106 实验过程 通过arp-scan来发现靶机的IP地址 sudo arp-scan --interface eth0 192.168.10.1…

mediapipe 谷歌高效ML框架-图像识别、人脸检测、关键点检测

参考&#xff1a; https://github.com/google/mediapipe https://developers.google.com/mediapipe/solutions/guide 框架也支持cv、nlp、audio等项目&#xff0c;速度很快&#xff1a; 1、图形识别 参考&#xff1a;https://developers.google.com/mediapipe/solutions/vi…

【从零开始学习JAVA | 第九篇】字符串综合练习

前言&#xff1a; 在前一篇我们学习了String类以及两个接口函数&#xff0c;今天我们将利用昨天的知识以及讲解新的方法进行几个实战操作&#xff0c;以此来巩固我们的所学内容。 1.实现用户登录&#xff0c;对用户输入的密码进行验证 需求&#xff1a;已知正确的用户名和密码…

31 linux 中 用户栈帧 -> 内核栈帧

前言 比如 我们之前调试的 glibc 相关的库函数 glibc 相关是属于用户程序, 调用 操作系统的系统调用的时候, 会是 怎么样的一个情况呢? 系统调用 会有对应的系统栈帧来处理 系统调用的相关函数调用的堆栈支持 测试用例 我们这里主要是以 printf 中会分配缓冲区调用 ma…

NVIDIA Thrust教程

NVIDIA Thrust教程 Thrust 的 API 参考指南&#xff0c;CUDA C 模板库。 1.简介 Thrust 是基于标准模板库 (STL) 的 CUDA 的 C 模板库。 Thrust 允许您通过与 CUDA C 完全互操作的高级接口&#xff0c;以最少的编程工作实现高性能并行应用程序。 Thrust 提供了丰富的数据并…

windows自带的linux系统,从C盘迁移到D盘

1. 查看当前wsl版本和 运行状态 wsl -l -v wsl --list, -l 用于列出分发 本人电脑装的是Ubuntu-18.04&#xff0c;正在运行&#xff0c;版本1 2. 在D盘建linux目录&#xff0c;打包Ubuntu-18.04&#xff0c;导入到D盘的linux目录 wsl --export <DistributionName> &l…

9个最实用的PS插件盘点!

因为个人原因&#xff0c;对PS的插件用了不下 100 款&#xff0c;其中有好有坏&#xff0c;有优有劣&#xff0c;大浪淘沙&#xff0c;优胜劣汰&#xff0c;现在整理了自己觉得不错的 PS 插件。 1、Alien Skin Blow Up 3 for mac Blow Up 3 mac 版是 Macos 上一款 PS 图像无损放…

Apache Zeppelin系列教程第十篇——SQL Debug In Zeppelin

SQL Debug介绍 首先介绍下什么是SQL Debug&#xff1f; 但是经常有这样一个需求&#xff0c;一大段sql 跑出来之后&#xff0c;发现不是自己想要的结果&#xff1f;比如&#xff1a; demo 1: select id,name from ( select id,name from table1 union all select id,name fr…

web漏洞之文件上传漏洞

文章目录 一、漏洞原因二、漏洞危害三、漏洞利用1.三个条件2.利用方式3.绕过方式a.绕过JS验证① BP绕过② F12绕过③ 菜刀上传实操 b.绕过MIME-Type验证c.绕过黑名单验证① 直接修改后缀名绕过② htaccess绕过(有拦截)③ 大小写绕过(有拦截)④ 空格绕过⑤ .号绕过⑥ 特…

技术改变生活,开发者必须掌握这些技能

技术改变生活&#xff0c;开发者必须掌握这些技能 一、前言二、背景三、开发者必须掌握这些技能1. 语言与编程2. 数据结构与算法3. 开发框架与工具4. 应用开发与测试5. 团队协作与沟通 一、前言 随着科技的不断进步和发展&#xff0c;我们的生活方式也在不断地变化。互联网、智…

Session覆盖测试-业务安全测试实操(19)

弱Token设计缺陷测试,Session覆盖测试 Session覆盖测试 测试原理和方法 找回密码逻辑漏洞测试中也会遇到参数不可控的情况,比如要修改的用户名或者绑定的手机号无法在提交参数时修改,服务端通过读取当前session会话来判断要修改密码的账号,这种情况下能否对Session中的内容做…

【架构】洋葱架构

文章目录 前言一、为什么要用洋葱架构&#xff1f;二、原则2.1、依赖性2.2、数据封装2.3、关注点的分离2.4、耦合性 三、洋葱架构层四、领域模型/实体五、领域服务六、应用服务七、基础设施服务八、可观察性服务九、测试策略十、微服务十一、模块化与打包十二、框架、客户端和驱…

基于Java个人博客网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

基于Java游戏攻略网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

【Unityc#专题篇】之c#进阶篇

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【C#进阶】C# 索引器

序号系列文章13【C#进阶】C# 特性14【C#进阶】C# 反射15【C#进阶】C# 属性 文章目录 前言1、索引器的概念2、索引器的定义3、索引器的基本使用4、索引器的重载5、接口中的索引器6、属性和索引器之间的比较7、索引器的适用场景结语 前言 &#x1f342; Hello大家好啊&#xff0c…

基于Java会员管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…