简单了解java中的Map集合

Map

1、Map集合概述

java.util.Map<K, V>集合,里面保存的数据是成对存在的,称之为双列集合,我们称之为键值对。而Collection集合中的元素是单个存在的,称之为单列集合。

2、Map集合的特点

1、可以存储两个数据

2、key元素不能重复,value可以重复

3、一个key元素值对应一个value元素

4、存取元素不保证顺序

5、没有索引

6、Map集合不能直接遍历

3、Map集合常用实现类

1、HashMap:

HashSet底层实现就是HashMap完成的,HashSet保存的元素其实就是HashMap集合中保存的键,底层结构是哈希表结构,具有键唯一,无序的特点。

2、LinkedHashMap:

底层结构是链表和哈希表结构,去重,有序。

3、TreeMap

底层是红黑树,去重,通过键排序。

4、Map集合中常用的方法

4.1、Map中常用的方法

方法说明
public V put (K key, V value)把指定的键和指定的值添加到Map集合中
public V remove (Object key)把指定的键所对应的键值对元素在Map集合中删除,返回被删除的元素的值
public V get (Object k)根据指定的键在Map集合中获取指定的值
public Set< K > keySet ()获取Map中所有的键存储在Set集合中
public Set<Map.Entry<K, V>> entrySet ()获取Map中所有的键值对对象集合
public boolean containKey(Object key)判断该集合中是否有此键

4.2、简单代码示例

public static void main(String[] args) {Map<String, String> map = new HashMap<>();//添加元素map.put("哇", "糖锅好厉害!");map.put("啊", "糖锅人真好!");map.put("哈", "糖锅人真好!");map.put("喔", "糖锅真男人!");//key元素相同时,会用新的value值覆盖之前的value值map.put("哇", "糖锅真牛啊!");System.out.println(map);//删除map集合中的元素map.remove("喔");System.out.println(map);//获取集合中指定元素String demo = map.get("哇");System.out.println(demo);}

5、Map集合的遍历

5.1、键找值

获取Map集合中所有的key元素,遍历所有的key元素,通过key元素找到对应的value值。

//获取map集合中所有的keySet<String> set = map.keySet();for (String s : set) {System.out.println(s);}                       

5.2、键值对

获取Map集合中所有的Map.Entry,遍历所有的Map.Entry,通过Entry中的API方法获取对应的key和value.

Set<Map.Entry<String, String>> set1 = map.entrySet();
for (Map.Entry<String, String> entry : set1) {System.out.println(entry.getKey() + " = " + entry.getValue());}

6、Map集合存储自定义类型

代码示例:每个人(姓名、年龄)都有自己的爱好,人和爱好有对应关系,将人对象和兴趣爱好存储在map集合中。人作为键,兴趣爱好作为值。

要求:人的姓名和年龄相同视为同一人,不能重复存储

Person类

public class Person {String name;int age;public Person(String name, int age){this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

测试类

public class MapDemo1 {public static void main(String[] args) {Map<Person, String> map = new HashMap<>();map.put(new Person("爱坤", 23), "哎哟~你干嘛~");map.put(new Person("坤坤", 23), "爱大篮球");map.put(new Person("鸡哥", 23), "爱唱跳rap");Set<Person> people = map.keySet();for (Person person : people) {System.out.println(person + "--->" + map.get(person));}}
}

注意:在Map集合中当key存储的是自定义对象时,要保证数据存储的唯一性,需要自定义对象中重写hashcode、equals方法。

LinkedHashMap与HashMap语法规则相似,可对照HashMap使用。

7、TreeMap

7.1、介绍

有排序功能,键去重

1、可以自然排序(键所在的类要实现Comparable)

public class MapDemo2 {public static void main(String[] args) {TreeMap<Integer, String> treeMap = new TreeMap<>();treeMap.put(3, "hhh");treeMap.put(1, "aaa");treeMap.put(13, "jjj");treeMap.put(8, "uuu");treeMap.put(9, "www");System.out.println(treeMap);}
}

运行结果

{1=aaa, 3=hhh, 8=uuu, 9=www, 13=jjj}

如果想要倒序排序可以这样写

public class MapDemo2 {public static void main(String[] args) {TreeMap<Integer, String> treeMap = new TreeMap<>(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return b - a;}});treeMap.put(3, "hhh");treeMap.put(1, "aaa");treeMap.put(13, "jjj");treeMap.put(8, "uuu");treeMap.put(9, "www");System.out.println(treeMap);}
}

运行结果

{13=jjj, 9=www, 8=uuu, 3=hhh, 1=aaa}

2、若自定义类没有自然排序功能,或自然排序功能不满足我们的需求时。我们可以自定义比较器排序(Comparator)

使用6中的Person类,将其存储于一个TreeMap集合中去,集合按照Person类中年龄大小升序排序,若年龄相同则进行降序排序。

public class MapDemo3 {public static void main(String[] args) {TreeMap<Person, String> treeMap = new TreeMap<>(new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {int res = p1.age - p2.age;if(res == 0){res = p2.name.compareTo(p1.name);}return res;}});treeMap.put(new Person("aaa", 24), "测试数据1");treeMap.put(new Person("bbb", 24), "测试数据2");treeMap.put(new Person("ccc", 24), "测试数据3");treeMap.put(new Person("ddd", 23), "测试数据4");treeMap.put(new Person("eee", 89), "测试数据5");Set<Person> people = treeMap.keySet();for (Person person : people) {System.out.println(person);}}
}

运行结果

Person{name='ddd', age=23}
Person{name='ccc', age=24}
Person{name='bbb', age=24}
Person{name='aaa', age=24}
Person{name='eee', age=89}

两种排序方式对应了TreeMap两个构造方法:

public TreeMap()//使用自然排序
public TreeMap(Comparator<? super K> comparator) //比较器

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

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

相关文章

微信小程序 导航navigation-bar

属性类型默认值必填说明最低版本titlestring否导航条标题2.9.0loadingbooleanfalse否是否在导航条显示 loading 加载提示2.9.0front-colorstring否导航条前景颜色值&#xff0c;包括按钮、标题、状态栏的颜色&#xff0c;仅支持 #ffffff 和 #0000002.9.0background-colorstring…

微信机器人实现OCR识别录入数据

介绍 采用微信的hook插件&#xff0c;然后解析微信发来的数据图片&#xff0c;通过ocr识别 然后将数据落入execl表格中。同时有权限的人可以导出数据表格即可。 流程图 代码片 文本消息处理流程_robot.py elif msg.type 0x01: # 文本消息# 管理员列表dba_user_list [wxid_…

关于Latitude5490的问题Bios引导问题

关于Latitude5490的问题Bios引导问题 一、问题描述1、第一次维修&#xff1a;2、第二次维修&#xff1a; 二、捣鼓过程1、Latitude 5490的Bios引导2、捣鼓硬盘分区格式3、使用PE修复引导4、处理方法 三、参考链接 一、问题描述 本人原本电脑型号为Latitude 5480&#xff0c;电…

Git:从配置到合并冲突

目录 1.前言 2.Git的下载与初始化配置 3.Git中新建仓库 4.Git的工作区域和文件状态 5.Git中查看操作和提交记录 6.Git中添加和提交文件 7.Git中回退提交版本 8.Git中查看版本间的差异 9.Git中删除文件 10.Git中忽略指定文件 11.Git中配置SSH密钥 12.Git中关联克隆仓库 13.Git中…

Windwos下运行程序如何不弹出黑窗口(控制台窗口)

一、在程序最开始处加一句&#xff1a; #pragma comment(linker,"/subsystem:windows /entry:mainCRTStartup") 二、在CMakeLists.txt里面加上WIN32

结构体(c++语言)

在实际问题中&#xff0c;一组数据往往具有不同的数据类型。例如&#xff0c;人口大普查时&#xff0c;我们需要记录每一位公民的姓名&#xff0c;年龄&#xff0c;性别&#xff0c;住址&#xff0c;身份证号码。这些信息分别要用整型&#xff0c;字符型&#xff0c;字符串型来…

Promise.any 使用方法

Promise.any() 是 JavaScript 中的一个静态方法&#xff0c;用于处理多个 Promise&#xff0c;并返回第一个成功解决&#xff08;fulfilled&#xff09;的 Promise 的结果。它在 ES2021&#xff08;ES12&#xff09;中引入&#xff0c;是 Promise 类的一部分。 语法 Promise.…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格&#xff08;…

windows10使用触控板、鼠标(magic trackpad)———附带BootCamp6驱动下载链接

文章目录 0 背景1 步骤1.1 下载1.2 解压1.3 安装驱动 参考 0 背景 最近在台式机&#xff08;windows10系统&#xff09;上使用mac设备&#xff0c;键盘magic keybord连上数据线就可以直接使用&#xff0c;但是触控板magic trackpad却不行&#xff0c;只有鼠标左键&#xff0c;…

每日一题——Python实现PAT甲级1077 Kuchiguse(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 方案1&#x…

CloudFlare 防火墙规则里开放合法 Bot 爬虫的方法

明月使用 CloudFlare 也算是有一阵子了,可以说效果非常好更是非常满意,毕竟每天成千上万的 Web 攻击和 cc 攻击都能控制在几乎可以忽略不计的程度了,上次因调试需要关闭了国内线路上的网站卫士统计图覆对比就很能说明这点儿: 这是关闭防火墙当天的实时防御统计结果 这是开启…

刘强东的拼搏哲学与产品创新的启示

在当今这个快速变化的时代&#xff0c;成功不再是偶然&#xff0c;而是需要一种敢于挑战、敢于拼搏的精神。正如京东创始人刘强东所说&#xff1a;“实现梦想&#xff0c;记住这句话就够了。敢于挑战&#xff0c;敢于拼搏的人不一定能成功&#xff0c;但成功的人一定是敢于挑战…

linux Ubuntu安装samba服务器与SSH远程登录

目录 1&#xff0c;下载安装包 2&#xff0c;添加服务器 3&#xff0c;修改服务器配置 3.1 备份配置文件 3.2 修改配置 4&#xff0c;开启samba服务器 5&#xff0c;开关电脑与服务器设置 6&#xff0c; SSH远程登录 1&#xff0c;下载samba服务器安装包 sudo apt in…

unity3d:GameFramework+xLua+Protobuf+lua-protobuf,生成.cs,.pb工具流

概述 1.区分lua&#xff0c;cs用的proto 2.proto生成cs&#xff0c;使用protogen.exe&#xff0c;通过csharp.xslt修改生成cs样式 3.proto生成lua加载.pb二进制文件&#xff0c;并生成.pb列表文件&#xff0c;用于初始化加载 4.协议id生成cs&#xff0c;lua中枚举 区分cs&…

Splashtop正式入驻长三角(杭州)制造业数字化能力中心,赋能企业向数字化转型

2024年6月&#xff0c;Splashtop正式入驻长三角&#xff08;杭州&#xff09;制造业数字化能力中心。作为全球领先的远程桌面控制软件供应商&#xff0c;Splashtop致力于提供适用于远程办公、IT 和 MSP 远程支持等多场景的高性能远程桌面控制软件和解决方案&#xff0c;赋能企业…

监控易监测对象及指标之:全面监控定制版微软活动目录

随着企业信息化建设的深入&#xff0c;微软活动目录&#xff08;Active Directory, AD&#xff09;作为企业身份管理、资源访问控制及策略应用的核心组件&#xff0c;其稳定性和性能对企业业务的连续性和效率至关重要。为了满足不同企业的特定需求&#xff0c;定制版微软活动目…

Qt之QGraphicsView —— 笔记3:矩形图元连接(附完整源码)

效果 完整源码 注意:在ui文件中拖入一个QGraphicsView类窗口控件,然后用MyGraphicsView提升该类。 main.cpp #include "widget.h" #include <QApplication>int main(

SpringBoot+Vue学生宿舍管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 学生宿管员管理员 功能截图

基于非下采样小波包分析的滚动轴承故障诊断(MATLAB R2021B)

小波变换具有良好的时频局部化特性和多分辨率特性&#xff0c;可准确定位信号的突变点并可在不同尺度上描述信号的局部细节特征&#xff0c;被广泛应用于信号降噪。但标准正交小波变换不具有平移不变性&#xff0c;采用标准正交小波对信号消噪后&#xff0c;会在脉冲尖峰处产生…

Polar Web【简单】PHP反序列化初试

Polar Web【简单】PHP反序列化初试 Contents Polar Web【简单】PHP反序列化初试思路EXP手动脚本PythonGo 运行&总结 思路 启动环境&#xff0c;显示下图中的PHP代码&#xff0c;于是展开分析&#xff1a; 首先发现Easy类中有魔术函数 __wakeup() &#xff0c;实现的是对成员…