集合知识点二:Map接口实现类

Java集合框架完全指南:从List到Map,一文掌握四大核心接口与常用实现类 如需完整代码或进一步探讨,欢迎在评论区留言或访问我的优快云博客!作为Java开发者,持续输出技术总结是提升能力的关键。无论你是初学Java的新手,还是希望巩固基础的中级开发者,本文都将成为你的集合类“速查手册”📚。2️⃣ 掌握ArrayList、LinkedList、HashSet等高频类的使用场景;四大接口,提供了灵活的数据存储方案。选择合适的实现类需综合考虑。3️⃣ 通过对比表格与代码注释,快速选择最优集合方案。掌握这些集合类的特性,是Java开发的基础技能。,获取更多Java学习和开发干货! 阅读详情

双列集合

双列集合图谱

Map接口

保存一组映射关系,键不可以重复,值可以重复

Map接口的实现类hashmap

底层结构
Jdk7:数组+链表
Jdk8:数组+链表+红黑树

结构数组类型初始化容量
Jdk7数组+链表Entry16
Jdk8数组+链表+红黑树Node0

Hashmap中维护了node类型的数组table,默认为null,无序

  1. 当创建对象时,将加载因子loadfactor初始化为0.75,其他成员保持默认值
  2. 添加元素时,相当于putval方法,需要先将待添加元素的哈希值算出来,并在数组中查找相应的索引处是否已存在元素,若不存在直接添加,如果该索引处已有元素,则判断是否相等,相等则直接覆盖,若不相等,则继续判断是否满足为树结构或链表结构,根据不同结果进行不同处理
  3. 如果需要扩容(resize),初次扩容,table的capacity为16,临界值threshold为12,其它次扩容table的capacity为当前的2倍,临界值threshold为当前的2倍
    临界值:数组容量*loadfactor
    扩容过程是非常消耗性能的因为要从新计算所有元素在新数组中所在的位置,所以我们尽量要提前预测元素个数
  4. 当链表中节点数>=8&&capacity>=64 则由链表结构变为树结构

Hashmap底层是一个特殊的数组,可以理解为该数组每个元素是一个链表

在这里插入图片描述

Jdk1.8之前的 数组+链表
在一个链表查询元素时,时间复杂度为O(n),效率很低

Jdk1.8之后,当在同一个hash值下的Entry数大于8时,就不再采用单链结构形式存储,转而采用红黑树存储数据
在这里插入图片描述

Jdk8之后 数组+链表+红黑树

当添加元素时put(),会先调用hashcode方法对待添加元素的key值进行hash运算,运算出结果确定待添加元素应该放在数组的那个位置,如果确定后发现该位置已有一个Entry,再通过equals方法对待添加元素的key和已有Entry的key进行比较,返回true待添加元素的value覆盖已有Entry的value,返回false待添加元素将于已有Entry形成Entry链表,而且新添加的元素位于链表头部
当查找元素时get(),会先调用hashcode方法对key进行hash运算,确定待查元素在数组中的哪个位置,当确定在数组中的那个位置后,jdk1.7之前是直接调用equals方法对该链表下的所有Entry的key进行比较查找(遍历)对应的Entry,找到返回value,时间复杂度为O(n),jdk1.8之后,需要判断数组该位置是否为红黑树结构,时间复杂度为O(log2N) 红黑树增删查时间复杂度均可记为O(log2N),N为红黑树元素个数

线程不安全:
ConcurrentModificationException 当在多线程的环境下对普通hashmap进行修改时,会报错,因为hashmap支持fast-fail机制,即hashmap每次修改,modcount就会+1,在迭代器初始化过程中会将modcount赋给迭代器的expectedModCount,在迭代过程中判断二者是否相等,不相等证明有线程修改了hashmap,立刻报ConcurrentModificationException异常

Linkedhashmap继承Hashmap1.7,但是不同的是底层在维护Entry的同时还维护了一个双向链表,使得在保存Entry数据的同时还保存了前一个元素before和后一个元素after的引用,从而在hash表的基础上又构成了一个双向链表 具有可预知的迭代顺序
不同步
实现了Fast-fail快速失败机制

Map接口的实现类Treemap sortedmap接口的实现类

底层结构是红黑树,一个二叉查找树,可以实现对添加元素key的自然排序和定制排序

 public class TreeMap<K,V>
     extends AbstractMap<K,V>
     implements NavigableMap<K,V>, Cloneable, java.io.Serializable

其中NavigableMap 是它实现的一个核心接口,NavigableMap接口继承了SortedMap(继承了Map)即一个支持排序的map,所以treemap才会支持排序

Treemap四个构造
无参 默认实现key的自然排序
有参 参数为comparator比较器 实现定制排序
有参 参数为map 实现key的自然排序
有参 参数为map ,comparator比较器 实现key的定制排序

自然排序:
要求待添加元素必须实现compareable接口并实现compareTo方法
定制排序:
要求待添加元素无序实现compareable接口,但创建Treemap对象时必须传入comparator的比较器,并实现compare方法(匿名内部类)

Map接口的实现类ConcurrentHashMap 同步hashmap

底层结构:双数组+链表 使用锁分离技术
Key唯一,值可以重复,不允许出现null键null值,无序的

在这里插入图片描述

Concurrenthashmap的数据结构可以这样理解:Concurrenthashmap底层是一个特殊的数组,数组中每一个元素都是hashtable(synchronized实现同步,fast-fail机制),hashtable的底层是一个Entry{}数组+链表(与hashmap类似唯一区别是线程安全),每一个Entry对象都是由K-V键值对组成的。这里就相当于把Concurrenthashmap分成了许多个hash表,每一个是一段即一个segment(就是一个hashtable)。这里每一个hashtable都有自己的锁,因为hashtable集合是线程安全的,这样只要并发发生在不同的segment上(即不同的hashtable上),各个段就可以并发进行

Concurrenthashmap是为了解决线程安全问题,hashmap是非同步的,当涉及到多线程且有读有写操作时,hashmap需要实现同步,随之带来的是将无法快速随机访问,此时就需要线程安全的map,此时我们通常的方案有hashtable或Collections.synchronizedMap(hashMap)经同步包装后的hashmap,二者的共性就是将会对整个hash表结构加上同步锁,这样当有一个线程对表进行操作时其它线程只能等待,性能不高,所以我们引入concurrenthashmap

Concurrenthashmap 定位一个元素需要进行两次hash操作,第一次定位到元素所在的segment,第二次定位到元素所在的链表的头部。所以concurrenthashmap相比较与hashmap,他的hash时间要长,但是能写操作的时候,只需要对元素所在的segment进行加锁即可,不影响其他元素的segment。所以在多线程性能上,concurrenthashmap要高于hashmap,在理想状态下,concurrenthashmap支持16个线程同时执行并发写操作(如果并发级别设置为16),及任意数量线程的读操作

Hashset 与 Hashmap区别
HashsetHashmap
实现接口SetMap
储存对象对象(实际也是K-V)键值对
添加元素方法.add().put()
索引计算(hashcode值)成员对象 计算键 计算
查找获取速度慢快 用键来查找
重复不允许重复键值不允许重复
同步不同步不同步
Hashtable和Hashmap比较

Hashtable类似于jdk1.7中的hashmap,最大区别在于它是线程安全

HashtableHashmap
同步同步不同步
基于类DictionaryAbstractmap基于map接口的实现
Null值问题Key value均不能为nullKey value 均可以为null
初始容量默认初始为11,扩容为old*2+1默认初始为16,old*2

Collections工具类 collection是集合接口 二者一定要区分开
Collections 是java.util包下的工具类,提供了一些列对集合进行操作的静态方法.

集合使用泛型的好处 ?
1、减少了编译警告
2、编译时检查类型,提高类型的安全性
3、大大减少了类型转换的次数,提高了效率

掌握Java中的Map接口及其实现类 Map是Java集合框架的核心接口之一,专门用于存储键值对(key-value pairs)。Map接口的实现类允许我们通过键来快速检索、更新或删除对应的值。本章将介绍Map接口的一些基本特性、常用操作方法以及这些方法如何帮助我们有效地管理键值对数据。在Java集合框架中,除了我们已经探讨过的HashMap、TreeMap、LinkedHashMap和ConcurrentHashMap等常用Map实现,还有一些专为特定场景设计的Map实现类,它们往往可以解决一些非常具体的编程问题。 阅读详情

相关推荐

别再用默认参数了!手把手教你用2P2Z补偿网络优化Buck电源的动态性能

本文详细介绍了如何通过2P2Z补偿网络优化Buck电源的动态性能,解决默认参数下的负载阶跃响应问题。从频域分析到元件选型,再到实测验证,手把手教你提升相位裕度,显著降低超调量和稳定时间,适用于DCDC和开关电源设计。

weixin_33657398的博客 256

map的实现类

map的主要实现类 map的主要实现类包括 HashMap、TreeMap、HashTable、LinkedHashMap. HashMap HashMap是没有顺序的,他的存储方式是用key的HashCode来存储的数据的。

qq_45559707的博客 1992

dpdk 源码分析 rte_ring

rte_ring源码分析

qq_40843445的博客 929

Map的有序和无序实现类,与Map的排序

Map的有序和无序实现类,与Map的排序 1.HashMap、Hashtable不是有序的; 2.TreeMap和LinkedHashMap是有序的(TreeMap默认 Key 升序,LinkedHashMap则记录了插入顺序)。 今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序。 一...

Rookie20190715的博客 4043

KiCad 7.0 + 嘉立创打样:从原理图到实物,打造你的双LLCC68 LoRa串口透传板

本文详细介绍了使用KiCad 7.0设计双LLCC68 LoRa串口透传板的完整流程,从原理图设计到嘉立创打样。重点解析了AVR+LLCC68组合的优势、双模块布局的电磁兼容设计、SPI接口配置及射频走线技巧,并提供了实测数据和常见问题解决方案,帮助开发者高效实现物联网设备的低功耗远距离通信。

weixin_28693447的博客 259

TC397 EB MCAL开发从0开始系列 之 [13.1] Dma配置实战 -实现M2M数据传输(读存储写存储)

TC3XX TC397 MCAL DMA 从0搭建测试用例-实现M2M 存储到存储数据传输

yy九歌的博客 1913

java中Map有哪些实现类和使用场景

     Java中的map是一个很重要的集合,他是一个接口,下面继承它实现了多个实现类,这些类各有千秋,各自有个各自的优点和缺点,先上图。     map的主要特点是键值对的形式,一一对应,且一个key只对应1个value。其常用的map实现类主要有HashMap、HashTable、TreeMap、ConcurrentHashMap、LinkedHashMap、weakHashMap等等。1、...

此心光明,亦复何言~ 4万+

海思SD3403/SS928V100开发(6)单路GMSL-MIPI-YUV相机视频输入调试

硬件连接:森云GMSL相机 -> GMSL 解串器 -> SD3403 MIPI0暂时先进行单路视频输入通路调试。

jzwjzw19900922的博客 1933

Java Map接口及其常用实现类详解

在Java编程语言中,Map是一个非常重要的接口,它代表了一个对象映射到另一个对象的映射关系。Map中的每一个元素都包含一个键和一个值,键在Map中是唯一的,但值可以重复。:ConcurrentHashMap是Java 5引入的一个线程安全的Map实现类,它提供了比Hashtable更高的并发性能。Map接口是Java集合框架的重要组成部分,提供了键值对的映射功能。:LinkedHashMap是HashMap的一个子类,它维护了一个双向链表来记录插入的顺序,因此它提供了按照插入顺序遍历元素的功能。

yokeyhui的博客 963

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

基于 Qt C++ 的 船舶导航系统 UI

你想实现一个基于 **Qt C++** 的 **船舶导航系统 UI**,核心功能包括 **Qt Quick** 电子海图显示和 **NMEA 0183** 协议解析。"断开" : "连接"创建一个 Qt Quick 项目,选择 **Qt 6** 版本,确保勾选 **Qt Quick**、**Qt Network** 和 **Qt SQL** 模块。Label { text: "纬度:" }3. **连接设备**:点击 "连接" 按钮连接到 GPS 设备或模拟数据源。title: "连接设置"

寒寒豆豆软件公司的博客 127

Map接口及其实现类

Map接口及其实现类

weixin_46286023的博客 3184

Doris实战——结合Flink构建极速易用的实时数仓

Doris实战——结合Flink构建极速易用的实时数仓

爱吃辣条的博客 8229

Java中Map接口的使用和有关集合的面试知识点补充

那么关于java的集合学习总结就结束了,我也要去学习MySql了,如果有好的经验或者收获一定会分享给大家,期待你的关注和鼓励哦~

叶落秋白的博客 2634

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【JAVA】集合,Collection接口和Map接口的实现类及其常用方法

add:添加单个元素 remove:删除指定元素 contains:查找元素是否存在 size:获取元素个数 isEmpty:判断是否为空 clear:清空 addAll:添加多个元素 containsAll:查找多个元素是否都存在 removeAll:删除多个元素 iterator:用于遍历Collection集合中的元素 List接口额外的常用方法 1)List集合类中元素有序(添加顺序和去除顺序一致)、且可重复 2) List集合中每个元素都有其对应的顺序索引,即支持索引。add(int index,

qq_43710228的博客 2184

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【JavaSE系列】Java集合框架之Collection,Map接口

本篇文章带大家认识Java基础知识——集合框架,从本篇文章开始正式拉开数据结构的序幕,要深入了解一件事,那必然先得见个面,本文带大家认识Java集合框长什么样,以及怎么使用Collection和Map接口。

未见花闻的博客 1832

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java集合篇:Map接口、Map接口的实现类、Collections集合工具类

学习Java的第21、22天,学习Java集合篇:Map接口、Map接口的实现类、Collections集合工具类,记得看完再多做做源码解析,加深印象

weixin_51612062的博客 1461

Java 集合框架:Map 接口

本文系统介绍了Java中的Map接口及其核心特性。文章详细解析了Map的子接口(SortedMap、ConcurrentMap)和实现类(HashMap、TreeMap等),阐述了三种集合视图(keySet、values、entrySet)的访问方式。同时,讲解了不可修改Map的创建方法,以及put、remove、get等基础操作方法,并提供了多种遍历Map的方式(增强for循环、迭代器、forEach、entrySet)。最后,还介绍了replace方法的使用场景。

Java孩子的博客 1146

Java 集合容器之Collection接口,Map接口实现类

对java集合相关知识,予以记录!集合可以看作是一种容器,用来存储对象信息,所有集合类都在java.util包下,且支持多线程的集合类位于java.util.concurrent包下Java的集合类主要由两个根接口派生出来,分别是Collection和Map。Java中的集合类一类是实现Collection接口;另一类是实现Map接口:Collection接口:单列集合,用来存储一个一个对象。Collection中可以容纳一组集合元素(Element)

qq_43357394的博客 549

Java - Map 接口及主要实现类

Map 接口及主要实现类一、Map 接口1. 基本介绍2. 常用方法3. Map接口的主要实现类二、Map 类集合的遍历1. 键找值方式2. 键值对方式Entry一、Map 接口 1. 基本介绍 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等。这种元素之间成对保持一一对应的关系称为映射。通常称构成映射关系的两个元素称为键值对(key-value)。Java 提供了专门的集合类用来存放这种对象关系的对象,java.util.Map 接口。 Map:双列集合

xing123456jl的博客 1822

java中Map有哪些实现类

Map接口是Java中的一种双列集合,它存储的是键值对(key-value pair)映射关系,即每个元素都包含一个键对象(Key)和一个值对象(Value),键和值之间存在一种对应关系,称为映射。Map接口中的键对象(Key)要求不能重复,而值对象(Value)则可以重复。Map接口提供了将键映射到值集合的对象,它不允许使用重复的键,每个键最多只能映射到一个值。

m0_60521228的博客 1812

Map接口的实现类

Map接口常用的实现类有: HashMap TreeMap 通常使用HashMap实现类实现Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系效率更高。 HashMap是基于哈希表的Map接口的实现,HashMap通过哈希吗对其内部的映射关系进行快速查找:由HashMap类实现的Map集合对于添加或删除映射关系效率较高;而TreeMap中的映射关系存在

hhhhhhhhuang的博客 2757

Java_集合进阶Map实现类

比如有如下案例:往HashMap集合中存储Student对象作为键,学生的家庭住址当做值。要求,当学生对象的姓名和年龄相同时就认为键重复。

qq_48083892的博客 1052

【Java基础-44.7】Java 中的 Map 集合接口:实现类、继承关系及常用方法详解

Map是 Java 集合框架中的一员,位于java.util包中。它表示一组键值对的集合,其中每个键(Key)都是唯一的,而值(Value)可以重复。Map键唯一性:每个键只能映射到一个值。无序性Map中的键值对没有固定的顺序(某些实现类如除外)。高效查找:通过键可以快速查找对应的值。Map是 Java 集合框架中非常重要的接口,提供了高效的键值对存储和操作能力。通过HashMapTreeMap等实现类,开发者可以根据具体需求选择合适的Map实现。本文详细介绍了Map。

weixin_39033358的博客 1447

Java集合框架讲解【泛型、Collection接口、Map接口、以及子接口和实现类、集合的遍历形式等】

文章目录集合概念集合和数组的区别Collection体系集合 集合 概念 对象的容器,实现了对对象常用的操作,类似数组功能。 集合和数组的区别 (1)数组的长度是固定的,集合长度不固定 (2)数组可以储存基本类型和引用类型,集合只能储存引用类型 Collection体系集合 ...

shuyv的博客 749
上一篇: 集合知识点一 : List/Set接口实现类
Amos_Object
博客等级 码龄8年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值