集合-Map系列

news2024/12/24 9:21:29

系列文章目录

1.集合-Collection-CSDN博客​​​​​​

2.集合-List集合-CSDN博客

3.集合-ArrayList源码分析(面试)_喜欢吃animal milk的博客-CSDN博客

4.数据结构-哈希表_喜欢吃animal milk的博客-CSDN博客

5.集合-set系列集合-CSDN博客

6.集合-Map系列-CSDN博客


文章目录

目录

系列文章目录

文章目录

前言

一 . 什么是Map?

 二 . HashMap

三 . LikedHashMap

 三 . TreeMap

总结


前言

大家好,今天给大家带来的是Map系列的集合,包括HashMap,TreeMap,LikedHashMap相关的内容。


一 . 什么是Map?

Map是一个接口类,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的,不能重复。

在Map中,每个键都是唯一的,而每个键对应一个值。通过键可以快速地查找和获取对应的值。Map提供了一系列的方法来操作键值对,例如put()方法用于插入键值对,get()方法用于获取指定键对应的值,remove()方法用于删除指定键的键值对等。

Map继承体系

Map接口有多个实现类,常用的有HashMap、LinkedHashMap和TreeMap。它们都实现了Map接口,并提供了不同的特性和性能。

  • HashMap是最常用的Map实现类,它使用哈希表(Hash Table)作为底层数据结构来存储键值对。它的插入、删除和查找操作的平均时间复杂度是O(1),具有较高的性能。
  • LinkedHashMap是基于HashMap的实现类,它在HashMap的基础上保持了插入顺序或者访问顺序。它通过双向链表来维护键值对的顺序,可以按照插入顺序或者访问顺序进行遍历。
  • TreeMap是基于红黑树(Red-Black Tree)的实现类,它根据键的自然顺序或者自定义的排序规则来对键值对进行排序。它的插入、删除和查找操作的时间复杂度是O(logN),具有较好的性能。

Map的特点:

  1. 键的唯一性:Map中的每个键都是唯一的,不允许重复的键存在。如果插入了相同的键,则后面的值会覆盖前面的值。

  2. 键值对的存储:Map以键值对的形式存储数据,每个键对应一个值。通过键可以快速地查找和获取对应的值。

  3. 无序性:Map中的键值对是无序的,即插入顺序和存储顺序不一致。如果需要有序的键值对,可以使用LinkedHashMap或TreeMap。

  4. 可以包含null键和null值:Map中可以包含null键和null值。但需要注意的是,HashMap和LinkedHashMap允许有一个null键和多个null值,而TreeMap不允许有null键,但可以有多个null值。

  5. 动态调整大小:Map的实现类会根据需要自动调整内部的存储容量。当键值对的数量超过了一定阈值时,会自动扩容,以保证插入和查找操作的性能。

  6. 高效的查找操作:通过键可以快速地查找对应的值,时间复杂度为O(1)或O(logN)。不同的Map实现类具有不同的查找性能,HashMap具有较高的查找性能。

Map常用方法:

  1. V put(K key, V value):将指定的键值对添加到Map中(键没有添加,有覆盖),并返回之前与该键关联的值(如果存在)。如果之前没有与该键关联的值,则返回null。

  2. V remove(Object key):从Map中删除指定键的映射关系,并返回之前与该键关联的值。如果Map中没有与该键关联的值,则返回null。

  3. boolean containsKey(Object key):判断Map中是否包含指定的键,如果包含则返回true,否则返回false。

  4. boolean containsValue(Object value):判断Map中是否包含指定的值,如果包含则返回true,否则返回false。

  5. int size():返回Map中键值对的数量。

  6. Set<K> keySet():返回包含Map中所有键的Set集合。

  7. Collection<V> values():返回包含Map中所有值的Collection集合。

  8. Set<Map.Entry<K, V>> entrySet():返回包含Map中所有键值对的Set集合。

总的来说,Map是一种存储键值对的数据结构,提供了快速的键查找和值访问的能力。不同的Map实现类具有不同的特性和性能,可以根据具体的需求选择适合的实现类。


 二 . HashMap

HashMap是Java中常用的Map实现类之一,它基于哈希表的数据结构来存储键值对。以下是HashMap的特点:

  1. 不重复:HashMap中的每个键都是唯一的,不允许重复的键存在。如果插入了相同的键,则后面的值会覆盖前面的值。

  2. 无序性:HashMap中的键值对是无序的,即插入顺序和存储顺序不一致。如果需要有序的键值对,可以使用LinkedHashMap或TreeMap。

  3. 无索引: hashMap底层是通过哈希表来实现,没有索引结构

entry对象: 键+值 组成的对象

底层会根据待存入元素的键来计算哈希值,找到应存入的位置,如果该位置已经有元素了,则会遍历整个链表(红黑树)调用equals方法比较键的属性值,如果有重复的键则会将该元素覆盖,反之则添加

在jdk8之前老元素会挂在新元素的下面,形成链表

jdk8开始

三 . LikedHashMap

LinkedHashMap是HashMap的一个子类,它在内部使用双向链表来维护键值对的插入顺序。与HashMap不同的是,遍历LinkedHashMap时,键值对的顺序与插入顺序一致。

LinkedHashMap具有以下特点:

  1. 有序性:LinkedHashMap会按照键值对的插入顺序来维护键值对的顺序。即,遍历LinkedHashMap时,键值对的顺序与插入顺序一致。

  2. 不重复:HashMap中的每个键都是唯一的,不允许重复的键存在。如果插入了相同的键,则后面的值会覆盖前面的值。

  3. 无索引

 三 . TreeMap

TreeMap是Java中的一个Map实现类,它基于红黑树(Red-Black Tree)数据结构实现。与HashMap和LinkedHashMap不同,TreeMap是有序的,它根据键的自然顺序或者自定义的比较器来维护键值对的顺序。

TreeMap具有以下特点:

  1. 有序性:TreeMap会根据键的自然顺序或者自定义的比较器来维护键值对的顺序。即,遍历TreeMap时,键值对的顺序是有序的。

  2. 不重复:HashMap中的每个键都是唯一的,不允许重复的键存在。如果插入了相同的键,则后面的值会覆盖前面的值。

  3. 无索引

  4. 可排序

TreeMap提供了HashMap中的常用方法,同时还提供了一些额外的方法来支持有序性,如:

  1. TreeMap():构造一个新的空树映射,它根据键的自然顺序进行排序。

  2. TreeMap(Comparator<? super K> comparator):构造一个新的空树映射,它根据指定的比较器进行排序。


总结

这篇博客给大家讲解了Map系列集合的用法和特性以及底层的机制,大家好好理解,我们下一篇博客见。

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

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

相关文章

指针详解第三部分

1. 字符指针变量 一种指针类型为字符指针 char*&#xff08;下面有两个代码表示了两种不同的用法&#xff09; int main() {char ch w;char* pc &ch;*pc w;return 0; }int main() {const char* pstr "hello bit.";//这⾥是把⼀个字符串放到pstr指针变量⾥了…

什么是JWT?深入理解JWT从原理到应用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

使用 Python 和 wxPython 进行批量文件扩展名替换

引言&#xff1a; 在日常的文件管理中&#xff0c;有时我们需要将一大批文件的扩展名进行替换。手动一个个重命名文件是一项繁琐的任务&#xff0c;但是使用 Python 编程语言和 wxPython 模块可以轻松地实现这一功能。本文将介绍如何使用 Python 和 wxPython 创建一个简单的图形…

Python学习笔记之分支结构与循环结构

Python学习笔记之分支结构与循环结构 一、分支结构 使用关键字if、elif、else 练习1&#xff1a;使用分支结构实现分段函数求值 """分段函数求值""" x float(input("x "))if x > 1:y 3 * x - 5 elif x < -1:y 5 * x 3…

开启创意思维,畅享Mindomo Desktop for Mac思维导图之旅

在数字化时代&#xff0c;我们需要一个强大而直观的工具来整理和展现我们的思维。Mindomo Desktop for Mac&#xff08;Mindomo&#xff09;作为一款免费的思维导图软件&#xff0c;将为您提供卓越的创意思维体验。 Mindomo拥有直观的界面和丰富的功能&#xff0c;让您能够方便…

手搭手Mybatis-Plus多数据源异构数据迁移案例

环境介绍 技术栈 springbootmybatis-plusdruidbaomidoumysqloracledm 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis 2.3.1 pom.xml所需依赖 <dependencies><dependency><groupId>org.springframework.…

【Golang】包

包 Go语言是使用包来组织源代码的&#xff0c;包&#xff08;package&#xff09;是多个 Go 源码的集合&#xff0c;是一种高级的代码复用方案 Go语言中为我们提供了很多内置包&#xff0c;如 fmt、os、io 等。 任何源代码文件必须属于某个包&#xff0c;同时源码文件的第一…

【2】c++设计模式——>UML表示类之间的继承关系

继承也叫作泛化&#xff08;Generalization&#xff09;&#xff0c;用于描述父子类之间的关系&#xff0c;父类又称为基类或者超类&#xff0c;子类又称作派生类。在UML中&#xff0c;继承关系用带空心三角形的实线来表示。 关于继承关系一共有两种&#xff1a;普通继承关系和…

【共享模型-----管程】

文章目录 1. 为什么会出现线程安全问题2. synchronized 解决方案2.1 线程八锁 3. 变量的线程安全分析3.1 局部变量线程安全分析3.2 常见线程安全类 1. 为什么会出现线程安全问题 一段代码块内如果存在对共享资源的多线程读写操作&#xff0c;称这段代码块为临界区 共享资源&a…

一张图看懂 8 种网络协议

什么是网络协议&#xff1f; 网络协议就是计算机之间沟通的语言&#xff0c;为了有效地交流&#xff0c;计算机之间需要一种共同的规则或协议&#xff0c;就像我们和老外沟通之前&#xff0c;要先商量好用哪种语言&#xff0c;要么大家都说中文&#xff0c;要么大家都说英语&a…

优思学院|六西格玛将烹饪和美味提升至极致

最近&#xff0c;我们曾提到一个美国男子如何利用六西格玛来控制糖尿病。这表明六西格玛逐渐被认为是一个不仅可以在工作场所之外使用&#xff0c;尤其不仅限于制造业的系统。 六西格玛的核心理念是改进过程的质量&#xff0c;从而改善最终结果。如果你做了晚餐或尝试了一道新…

ESP32设备驱动-OLED显示BME280传感器数据

OLED显示BME280传感器数据 文章目录 OLED显示BME280传感器数据1、BME280介绍2、硬件准备3、软件准备4、代码实现在本文中,我们将介绍如何使用OLED显示BME280传感器的数据。 1、BME280介绍 BME280 传感器用于测量有关环境温度、大气压力和相对湿度的读数。 它主要用于以低功耗…

2023/10/4 -- ARM

今日任务&#xff1a;QT实现TCP服务器客户端搭建的代码&#xff0c;现象 ser&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);server new QTcpSe…

JMeter性能分析实战一:日常登录接口

负载测试 日常需求&#xff1a;负载测试&#xff01; 对于桥的负载测试&#xff1a;我给你20t的一排车辆&#xff0c;看你能不能撑得住20t&#xff01; 对于系统的负载测试&#xff1a; 逐步增加负载&#xff0c;便于问题的发现和定位&#xff0c;不要操之过急。逐步增加负载…

由Long类型引发的生产事故

事情原由 今天测试忽然在群里发了一个看似非常简单的线上问题&#xff0c;具体是&#xff1a;在后台通过订单编号(orderId)修改订单信息时&#xff0c;修改不成功 &#xff0c;修改前后的订单数据完全没有发生变化。第一眼看到这个问题的时候&#xff0c;我心想后台实现逻辑并不…

CSS 语法

CSS 实例 CSS 规则由两个主要的部分构成&#xff1a;选择器&#xff0c;以及一条或多条声明: 选择器通常是您需要改变样式的 HTML 元素。 每条声明由一个属性和一个值组成。 属性&#xff08;property&#xff09;是您希望设置的样式属性&#xff08;style attribute&#x…

监狱劳动工具管理系统|智工具DW-S308的功能

监狱劳动工具管理系统(智工具DW-S308)是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对工具进行统一管理、分析的信息化、智能化、规范化的系统。 目前监狱的劳动工具管理很多还停留在固定工位&#xff0c;人盯人、人管人等落后的管理模式&#xff…

图谱滤波(Graph Spectral Processing)-1

时域和空域信号的滤波是图像处理的基本技术之一&#xff0c;迄今已得到广泛的研究。Graph Spectral Processing(GSP)可以处理不规则结构的信号&#xff0c;这些信号在数学上用图形表示。利用谱图理论研究了图信号滤波的理论和方法。在图像处理中&#xff0c;图是表示像素形成的…

华为云云耀云服务器L实例评测|RabbitMQ的Docker版本安装 + 延迟插件安装 QQ邮箱和阿里云短信验证码的主题模式发送

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍RabbitMQ的Docker版本安装和配置&#xff0c;延迟插件的安装&#xff1b;结合QQ邮箱和阿里云短信验证码…

Gurobi设置初始可行解

目录 1. 决策变量的Start属性直接设置变量的初始值 1.1 Start&#xff1a;MIP变量的起始值&#xff08;初值&#xff09;double类型&#xff0c;可更改 1.2 StartNodeLimit&#xff1a;限制了在完善一组输入部分变量的初始解时&#xff0c;MIP所探索的分支定界的节点的数量 …