当前位置: 首页 > news >正文

Map集合

Map集合

Map接口的简介

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。

Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,可以通过“键”查找“值”。一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KcLA0qP-1676012985302)(集合容器.assets/image-20220820094156849.png)]

|------Map(接口,键值对的集合(双列集合)

​ |----------HashMap(接口实现类 ,没有同步, 线程不安全)

​ |----------Hashtable(接口实现类,同步,线程安全

​ |----------LinkedHashMap(实现类,双向链表和哈希表实现)

​ |----------TreeMap(实现类, 红黑树对所有的key进行排序)

Map

  • HashMap 非线程安全,基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。

  • TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。

  • HashTable:是同步的,这个类中的一些方法加入了synchronized关键字,保证了HashTable中的对象是线程安全的,

  • LinkedHashMap:需要维护元素的插入顺序,性能低于HashMap,但在迭代访问元素时有很好的性能,但他以链表方式类维护内部顺序的。

HashMap实现类

1、基于哈希表的 Map 接口的实现,便于提高查询的效率。2、此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。3、此类不保证映射的顺序,特别是它不保证该顺序恒久不变。4、基于线程非同步,适用于单线程的环境中。
//HashMap实现类public   static  void    test1(){	Map   map = new  HashMap();//添加元素map.put("a",10);map.put("b",20);map.put("c",30);map.put("d",40);map.put(null, null);//重复的key会发生覆盖map.put("a", 100);//注意!List 和 Set集合最终输出结果的时候,显示的是[元素1,元素2,.......]//{null=null, d=40, b=20, c=30, a=100}-------- 1、map的元素是key-value格式     //2、发现是无序的;  3、允许null键 和  null值 ;    4、重复的key是会发生覆盖的;System.out.println(map);		
}

Map操作API

Map容器添加元素Map容器通过键取值Map容器中的索引(包含)Map容器中通过一个键移除一个值
  • containsKey()
//找对应的键(key),有对应的key返回true,没有则返回false
boolean containsKey(Object key);
  • containsValue()
//找对应的值(value),有则返回true,没有则返回false
boolean containsValue(Object value);
  • isEmpty()
//判断map集合是否有数据,有则返回false,没有则返回true
boolean isEmpty();
  • keySet()
//获取map集合中所有的键(key)
Set<K> keySet();
  • putAll()
//将map集合添加该集合中
void putAll(Map<? extends K, ? extends V> m);

remove()

//根据键(key)移除数据
V remove(Object key);
  • remove()
//根据键(key)和值(value)移除数据,移除成功返回true,移除失败返回false
default boolean remove(Object key, Object value)
  • clone()
//从此HashMap中实例一份副本
public Object clone()
//演示Map操作的API方法----1public   static  void   test2(){Person   person = new  Person("zhangsan",30);Map   map = new  HashMap();//添加元素(key是Object类型,value也是Object类型)map.put("a","admin");map.put("b", "guest");map.put(3, 100);map.put(4, 1000);map.put(new Date(), new Date());map.put("obj",person);map.put(person, person);System.out.println(map);//获取指定的元素值---通过key来获取Object  value1 = map.get(3);System.out.println(value1);value1 =	map.get("obj");System.out.println(value1);//索引包含(可以检测key ,也可以检测value)boolean is = map.containsKey("a");System.out.println(is);//true//针对key使用的是自定义的类型的时候,进行检测,必须要是同一个对象才可以。is = map.containsKey(person);System.out.println(is);is = map.containsValue(person);System.out.println(is);//通过key移除指定的元素Object  obj = map.remove("obj");//返回的就是被删除的对象:Person [name=zhangsan, age=30]System.out.println(obj);//{3=100, 4=1000, b=guest, a=admin, Person [name=zhangsan, age=30]=Person [name=zhangsan, age=30], Tue Jan 11 15:33:33 CST 2022=Tue Jan 11 15:33:33 CST 2022}System.out.println(map);}	
Map容器转化为Set容器(Entry对的集合)
Set set = map.entrySet();Map容器中键转化为Set容器(键的集合)
Set set = map.keySet();Map容器中值转化为Set容器( 值的集合)
Collection c= map.values();Map容器中其他基本判断和操作map.isEmpty();map.clear();map.size();
	// 演示Map操作的API方法--2public static void test3() {Map map = new HashMap();// 添加元素(key是Object类型,value也是Object类型)map.put("a", "admin");map.put("b", "guest");map.put(3, 100);map.put(4, 1000);//将所有的Entry对,转换到一个Set集合中Set  entrySet = map.entrySet();//[3=100, 4=1000, b=guest, a=admin]--------显示的是[]格式,不是{}格式。System.out.println(entrySet);//key-value:  专业类型Entry对;//将key全部转换为一个set集合Set    keySet = map.keySet();//[3, 4, b, a]System.out.println(keySet);//可以直接针对keySet这个集合进行迭代Iterator keyIts = keySet.iterator();while(keyIts.hasNext()){Object  key = keyIts.next();System.out.println(key);}//将所有的值获取Collection   coll = map.values();//[100, 1000, guest, admin]System.out.println(coll);//进行迭代展现coll.iterator();/*** 注意!* 我们发现在Map集合中,是没有提供迭代的方法,因为Map这种结构是无法直接进行迭代操作的;*///集合中的常规操作map.isEmpty();map.size();map.clear();}

提示!

通过以上的Map所有的API的学习,我们发现在Map结构的操作中,主要都是基于key(键)来实现的;

Hashtable实现类

1、此类实现一个哈希表,该哈希表将键映射到相应的值(key-value模式)。2、键或值不允许为null。3、Hashtable 是基于线程同步的,适用于多线程的环境中。4、Hashtable和HashMap的API几乎是一样的。
	public   static   void  test1(){Hashtable  map = new  Hashtable();map.put("a",15);map.put("b",17);map.put("c",18);map.put("d",10);//java.lang.NullPointerException,不允许存在null键和null值的;//map.put(null, null);  错误的//同HashMap比较起来,唯独多出的一个方法Enumeration en = map.elements();//en枚举中保存的是所有的value值,等同于 map.values();while(en.hasMoreElements()){Object obj = en.nextElement();System.out.println(obj);}//其余的API都是一样的;}	

LinkedHashMap实现类

1、LinkedHashMap实现类是HahsMap的子类;2、LinkedHashMap底层使用数据结构是链表 和 hash算法;3、具备了顺序的维护,针对插入、删除做了效率的提升,查询的效率也较高;4、LinkedHashMap也是基于线程非同步的,适用于单线程的环境中;5、LinkedHashMap 和  HashMap的API是完全一致的;
//LinkedHashMap中的API
public  static  void  test1(){LinkedHashMap  map = new  LinkedHashMap();//LinkedHashMap和 HashMap操作的API是完全一致的;map.put("a","admin1");map.put("b","admin2");map.put("c","admin3");map.put("d","admin4");map.put(null, null);//{a=admin1, b=admin2, c=admin3, d=admin4, null=null} ------  维护了插入时的顺序,同时允许null键和null值;System.out.println(map);}

TreeMap实现类

1、TreeMap底层的数据结构是基于二叉树(红黑树)的结构;2、针对TreeMap集合中的key是进行排序的处理的;3、TreeMap是基于线程非同步的,适用于单线程的环境中;4、TreeMap实现类中增添了不少的方法,但是对于我们使用来说,主要依赖的是排序功能,所以增添的这些方法我们了解就可以了;
//Comparable:个接口对实现它的每个类的对象强加了一个总的顺序。
public class Person extends Object implements Comparable{private String name;private Integer age;public Person(){}public Person(Integer age){this.age = age;}public Person(String name,Integer age){this.name = name;this.age = age;}public Person(Integer age,String name){this.name = name;this.age = age;}public String getName(){return name;}public void  setName(String name){this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return name+","+age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name) &&Objects.equals(age, person.age);}@Overridepublic int hashCode() {return Objects.hash(name, age);}@Overridepublic int compareTo(Object o) {if (o instanceof  Person){Person person =(Person) o;// return person.age - this.age;//从大到小return person.name.hashCode() - this.name.hashCode();}return 0;}
}public static void main(String[] args) {TreeMap treeMap = new TreeMap();Person person = new Person(1,"张三");Person person2 = new Person(9,"李四");Person person3 = new Person(3,"王五");Person person4 = new Person(19,"赵六");Person person5 = new Person(2,"唐七");treeMap.put(person,"z");treeMap.put(person2,"z");treeMap.put(person3,"z");treeMap.put(person4,"z");treeMap.put(person5,"z");System.out.println(treeMap);}
}

相关文章:

Map集合

Map集合 Map接口的简介 Map用于保存具有映射关系的数据&#xff0c;Map里保存着两组数据&#xff1a;key和value&#xff0c;它们都可以使任何引用类型的数据&#xff0c;但key不能重复。所以通过指定的key就可以取出对应的value。 Map 没有继承 Collection 接口&#xff0c…...

PyQt5编程扩展 3.2 资源文件的使用

目录 本例运行效果&#xff1a; 设计Qt窗体 建立项目 放一个Group Box 放三个Label 放一个Horizontal Slider 放两个Line Edit 层次结构 布局 放一个Group Box 放两个Label 放两个Line Edit 放一个Push Button 层次结构 布局 放一个frame 层次结构 布局 窗体…...

Linux系统之文件共享目录设置方法

Linux系统之文件共享目录设置方法一、本次实践目的二、检查本地系统环境1.检查系统版本2.检查系统内核三、创建相关用户及用户组1.创建共享目录2.创建测试用户账号3.创建用户组4.设置用户的属组5.查看admin和IT用户组成员6.查看所有用户信息四、共享目录权限设置1.设置/data/so…...

上海亚商投顾:三大指数均涨超1% 芯片板块集体大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。市场情绪三大指数今日低开高走&#xff0c;午后集体涨超1%&#xff0c;创业板指盘中涨超1.7%。芯片板块集体大涨&#xff0c;…...

Harbor私有仓库部署与管理

目录 前言 一、Harbor概述 二、Harbor 的特性 三、Harbor的构成 四、Harbor构建Docker私有仓库 1、环境配置 2、案例需求 3、部署Harbor服务 3.1、部署docker compose服务 3.2 下载或上传Harbor安装程序 3.3、启动Harbor 3.4、查看Harbor启动镜像 4、物理机访问se…...

互联网架构之 “高可用” 详解

一、什么是高可用 高可用HA&#xff08;High Availability&#xff09;是分布式系统架构设计中必须考虑的因素之一&#xff0c;它通常是指&#xff0c;通过设计减少系统不能提供服务的时间。 假设系统一直能够提供服务&#xff0c;我们说系统的可用性是100%。 如果系统每运行…...

分布式高级篇4 —— 商城业务(2)

一、订单服务1、订单基本概念2、订单基本构成3、订单状态4、订单流程5、配置拦截器拦截订单请求6、订单确认页模型抽取7、订单确认页vo封装8、Feign 远程调用请求头丢失问题\*\*\*\*\* 惨痛教训9、Feign 异步调用请求头丢失问题10、查看库存状态11、模拟计算运费12、接口幂等性…...

二分查找基本原理

二分查找基本原理1.二分查找1.1 基本概念1.2 二分查找查找步骤1.2.1 中间索引不能整除&#xff0c;取整数作为中间索引1.2.2 索引不能整除&#xff0c;整数1作为中间索引1.3 二分查找大O记法表示2. 二分查找代码实现1.二分查找 1.1 基本概念 二分法(折半查找&#xff09;是一…...

【Python实战案例】Python3网络爬虫:“可惜你不看火影,也不明白这个视频的分量......”m3u8视频下载,那些事儿~

前言 哈喽&#xff01;上午好嘞&#xff0c;各位小可爱们&#xff01;有没有等着急了呀~ 由于最近一直在学习新的内容&#xff0c;所以耽搁了一下下&#xff0c;抱歉.jpg 双手合十。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移…...

UE4:使用样条生成随机路径,并使物体沿着路径行走

一、关于样条的相关知识 参考自&#xff1a;样条函数 - 馒头and花卷 - 博客园 三次样条&#xff08;cubic spline&#xff09;插值 - 知乎 B-Spline(三)样条曲线的性质 - Fun With GeometryFun With Geometry 个人理解的也不是非常深&#xff0c;但是大概要知道的就是样条具…...

计算机组成原理(判断题)

计算机控制器是根据事先编好的程序&#xff0c;根据其指令来进行控制只会每一步骤的操作&#xff1b; 面向主存的双总线结构计算机系统&#xff0c;因在CPU与主存之间增加了一组存储器总线&#xff0c;由于通过存储器总线访存&#xff0c;提高了CPU的访存速度&#xff0c;也减轻…...

error: failed to push some refs to ... 就这篇,一定帮你解决

目录 一、问题产生原因 二、解决办法 三、如果还是出问题&#xff0c;怎么办&#xff1f;&#xff08;必杀&#xff09; 一、问题产生原因 当你直接在github上在线修改了代码&#xff0c;或者是直接向某个库中添加文件&#xff0c;但是没有对本地库同步&#xff0c;接着你想…...

DAMA数据管理知识体系指南之数据仓库和商务智能管理

第9章 数据仓库和商务智能管理 9.1简介 数据仓库&#xff08;Data Warehouse,DW)由两个主要部分构成&#xff1a;首先是一个整合的决策支持数据库&#xff0c;其次是用于收集、清洗、转换、存储来自于各种操作型数据源和外部数据源数据的相关软件程序。两者结合以支持历史的、…...

PHP的五种常见设计模式

工厂模式 最初在设计模式 一书中&#xff0c;许多设计模式都鼓励使用松散耦合。要理解这个概念&#xff0c;让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时&#xff0c;就会发生问题&#xff0c;系统其他部分 —— 您曾认为完全不相关的部分中也有…...

教你搞懂线段树,从基础到提高

秋名山码民的主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f64f;作者水平有限&#xff0c;如发现错误&#xff0c;还请私信或者评论区留言&#xff01; 目录前言线段树逻辑概念线段树的俩个重要用处代码实现线段树题目巩固最后…...

C语言进阶——自定义类型:结构体

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;生活不可能像你想象的那么好&#xff0c;也不会像你想象的那么糟。——莫泊桑《羊脂球》 目录 一、前言 二、正文 1结构体 1.1结构体的基础知识 1.2结构的声明 1.3特殊的声明 1.4结构体变量的…...

SpringSecurity学习笔记01

目录 一、课程介绍 二、框架概述 三、入门案例 四、基本原理&#xff08;过滤器链&#xff09; 五、基本原理&#xff08;过滤器加载过程&#xff09; 六、基本原理&#xff08;两个重要的接口) 七、web权限方案-用户认证&#xff08;设置用户名密码上&#xff09; 八、…...

Python语言零基础入门教程(十一)

Python 列表(List) 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置&#xff0c;或索引&#xff0c;第一个索引是0&#xff0c;第二个索引是1&#xff0c;依此类推。 Python有6个序列的内置类型&#xff0c;但最常见的是列表和元组。 序列都可以…...

现货白银基础知识

任何活动&#xff0c;任何项目&#xff0c;任何工作都离不开基础知识&#xff0c;这是肯定的。万丈高楼平地起&#xff0c;要想要简称百层高楼&#xff0c;首先得把低级打好&#xff01;现货白银投资也是一样的道理&#xff0c;现在我们就来一起聊聊现货白银基础知识的问题&…...

数据库原理及应用基础知识点

数据库原理基础知识点大全数据库原理及应用1、数据库系统概述1.1 基本概念1.2 数据模型1.3 数据库系统的结构2、实体 -- 联系模型2.1 基本概念2.2 实体-联系图2.3 弱实体集3、关系数据模型3.1 关系数据库的结构3.2 从ER模型到关系模型3.3 关系操作、完整性约束、关系代数4、关系…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...