集合知识点二: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实现类,它们往往可以解决一些非常具体的编程问题。 阅读详情

相关推荐

告别GIS软件!用R语言ggplot2+ggmapcn绘制出版级世界地图(附5种投影对比图)

本文提供了一份完整的实践指南,教你如何利用R语言及其强大的ggplot2生态系统,结合ggmapcn包,绘制出出版级的世界地图。文章详细对比了五种经典地图投影(如摩尔维德、罗宾森投影)的代码实现与视觉差异,并讲解了如何添加比例尺、指北针等专业元素,最终导出高清PDF,实现从数据分析到专业可视化的全流程代码化操作,彻底告别传统GIS软件。

p5l2m9n4o6q的博客 407

map的实现类

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

qq_45559707的博客 1992

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记

RaphaelCeo的博客 1545

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

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

Rookie20190715的博客 4043

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1158

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 474

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

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

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

Windows与Linux安装miniconda并启动python项目及指令

官方介绍:Miniconda 是 conda 的免费最小安装程序。它是 Anaconda 的一个小型引导版本,仅​​包含 conda、Python、它们都依赖的包以及少量其他有用的包(例如 pip、zlib 等)。如果您需要更多软件包,请使用该 命令从 Anaconda 公共存储库或其他渠道(例如 conda-forge 或 bioconda)默认提供的数千个软件包中进行安装。minicoda下载地址最好挂个梯子。如果你需要指定版本的conda,可以在这里下载历史版本的miniconda。

一直走的很慢的鸭子 3191

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

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

yokeyhui的博客 963

Token 费用爆炸?教你用 Semantic Cache(语义缓存)把 API 成本降低 80%

本文介绍了语义缓存(Semantic Cache)技术在大模型应用中的关键作用。传统Redis缓存基于精确匹配,无法处理用户提问的语义相似性,导致重复调用昂贵的LLM API。语义缓存通过将问题向量化并在向量空间中进行相似度匹配,可识别30%-50%的重复提问,直接返回历史答案。文章详细解析了技术原理(Embedding+向量搜索)、架构设计,并提供了基于Python和ChromaDB的50行核心实现代码。同时指出了生产环境中的三大挑战:阈值设定、隐私保护和多轮对话处理,并给出相应解决方案。该技术能以极低成

BUG猿的博客 1055

Kriging克里金模型实现数据回归预测Matlab代码

Kriging克里金模型实现数据回归预测Matlab代码

天天酷科研的博客 604

Map接口及其实现类

Map接口及其实现类

weixin_46286023的博客 3184

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

叶落秋白的博客 2634

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

未见花闻的博客 1832

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、付费专栏及课程。

余额充值