Java集合-Map接口(key-value)
Map接口的特点:①KV键值对方式存储②Key键唯一,Value允许重复③无序。
Map有四个实现类:1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类
1.HashMap类:
存储结构:哈希表 = 数组Node[ ] + 链表(红黑树)
扩容方法:resize()
扩容机制:原数组的2倍
特点:①Key唯一,不允许重复②Value允许重复③无序
HashMap: KV键值对集合,key唯一,value允许重复
put()方法:添加键值对,如果key不存在,则返回null; 如果key存在,则保存新value,返回旧
value
get()方法:根据key,获取value,如果key存在,获取该元素的键值对的value值;如果不存在,
则获取该元素的键值对的value值为null;如果返回的value为null, 类型转换时,会发生空指针
public static void main(String[] args) {// Map键值对集合//保存城市人口信息// key :城市名称.// val:人口数量HashMap<String,Integer> map = new HashMap<String,Integer>();map.put("X咸阳",1100);HashMap<String,Integer> anotherMap = new HashMap<String,Integer>();anotherMap.put("B北京", 2500);anotherMap.put("C长春", 300);anotherMap.put("D大连", 1000);map.putAll(anotherMap);anotherMap.put("D大连", 1000); //key不允许重复map.put("E鄂尔多斯", 1000);//value不允许重复System.out.println(map);}
输出:
{D大连=1000, E鄂尔多斯=1000, C长春=300, B北京=2500, X咸阳=1100}
put()与get()方法:
public static void main(String[] args) {HashMap<String,Integer> cityMap = new HashMap<String,Integer>();//put()方法:添加键值对//如果key不存在,则返回nullSystem.out.println(cityMap.put("X西安", 1100));System.out.println(cityMap.put("B北京", 2500));System.out.println(cityMap.put("C长春", 300));System.out.println(cityMap.put("D大连", 1000));//如果key存在,则保存新value,返回旧valueSystem.out.println(cityMap.put("X西安", 1200));//get()方法:根据Key值,获取value//key存在int value1 = cityMap.get("B北京");System.out.println("B北京===>"+value1);//key不存在Integer value2 = cityMap.get("N南京");System.out.println("N南京"+value2);//如果返回的value为null,类型转换时,会发生空指针int value3 = cityMap.get("N南京");}
输出:
null
null
null
null
1100
B北京===>2500
N南京null
Exception in thread "main" java.lang.NullPointerExceptionat com.zad.day24_1_26_01.Text08.main(Text08.java:28)
遍历map:
遍历Map
方式1:获取所有的key,然后按照每个key获取对应的value
方式2:获取所有的value
方式3:将每个KV键值对按照Entry类型的对象,统一获取
方式1 :获取所有的key,然后按照每个key获取对应的value
public static void main(String[] args) {HashMap<String,String[]> map = new HashMap<String,String[]>();map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });//遍历Map//方式1:获取所有的key,然后按照每个key获取对应的valueSet<String> keys = map.keySet();//获取map中所有的keySystem.out.println("所有的key:"+keys);System.out.println("按照每个key,获取对应的value");Iterator<String> it = keys.iterator();while(it.hasNext()) {String key = it.next();//获取每个keyString[] val = map.get(key);//按照key获取对应的valueSystem.out.printf("%s ---> %s \n",key,Arrays.toString(val)); }}
输出:
所有的key:[华语, 乐队, 欧美]
按照每个key,获取对应的value
华语 ---> [林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
乐队 ---> [魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
欧美 ---> [贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
方式2:获取所有的value
public static void main(String[] args) {HashMap<String,String[]> map = new HashMap<String,String[]>();map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });//遍历map//方式2:获取所有的valueCollection<String[]> values=map.values();for(String[] array:values) {System.out.println(Arrays.toString(array));}}
输出:
[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
方式3:将每个KV键值对按照Entry类型的对象,统一获取
public static void main(String[] args) {HashMap<String, String[]> map = new HashMap<String, String[]>();map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });//遍历Map//方式3:将每个KV键值对按照Entry类型的对象,统一获取Set<Entry<String,String[]>> entrys = map.entrySet();for(Entry<String,String[]> keyValue:entrys) {System.out.printf("%s--->%s\n",keyValue.getKey(),Arrays.toString(keyValue.getValue()));}}
输出:
华语--->[林俊杰, 陈奕迅, 邓紫棋, 薛之谦, 汪苏泷, 李荣浩]
乐队--->[魔力红, 烟鬼组合, 共和时代, 辅音组合, Linkin Park, Westlife]
欧美--->[贾斯丁比伯, 威肯, 艾兰沃克, 德雷克]
常用方法:
- 判断key是否存在: containsKey()方法
- 根据key获取value,如果key不存在,则返回default默认值: getOrDefault()方法
- 根据key,删除KV键值对:remove()方法
- 获取键值对的数量:size()方法
public static void main(String[] args) {//歌手分类HashMap<String, String[]> map=new HashMap<String, String[]>();map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });//判断key是否存在boolean isContains = map.containsKey("日韩");System.out.println(isContains);//根据key获取value,如果key不存在,则返回default默认值String[] value = map.getOrDefault("日韩", new String[] {});System.out.println(Arrays.toString(value));//根据key,删除KV键值对map.remove("欧美");System.out.println(map);//获取键值对的数量int size = map.size();System.out.println(size);}
输出:
false
[]
{华语=[Ljava.lang.String;@3d8c7aca, 乐队=[Ljava.lang.String;@5ebec15}
2
应用例:统计英文字母、中文、数字、标点符号的个数
public static void main(String[] args) {//统计英文字母、中文、数字、标点符号的个数String str = "OMG,你们的中英混搭真是各有千秋,但Someone丝毫掩盖不了你们那硬朗的英语底子!For eg.papi酱真的very有才华啊,哦买噶的,U6666666!!!罢特,someone也是成功地掩盖了自己小学程度的英语水平!这样式的,I是不会use的,because l hate 这种人very much~";//统计结果,保存到map中HashMap<String, Integer> map = new HashMap<String, Integer>();
// map.put("letters", 0);
// map.put("numbers", 0);
// map.put("chinese", 0);
// map.put("flags", 0);// 遍历字符串,判断每个字符for (int i = 0; i < str.length(); i++) {// 获取每一个字符char c = str.charAt(i);if (c >= 'A' && c < 'Z' || c > 'a' && c < 'z') {//获取一个字符int oldValue = map.getOrDefault("letters", 0);int newValue = oldValue + 1;map.put("letters", newValue);} else if (c > '0' && c < '9') {map.put("numbers", map.getOrDefault("numbers", 0)+1);} else if (c >= 0x4e00 && c <= 0x29fa5) {map.put("chinese", map.getOrDefault("chinese", 0) + 1);} else {map.put("flags", map.getOrDefault("flags", 0)+ 1);}}System.out.println(map);}
输出:
{chinese=79, flags=16, numbers=7, letters=52}
2.LinkedHashMap类:
存储结构:数组+链表+红黑树,,维护使用链表,记录顺序
特点:①Key唯一,不允许重复②Value允许重复③有序④LinkedHashMap是HashMap的子类
应用例:统计每个字符出现的次数
public static void main(String[] args) {//统计每个字符出现的次数//无序String str = "qurfkjcbsdjqpiurfufhdvlajydfgquyvhvaljhvqouygqhvhv";
// HashMap<String,Integer> map1 = new HashMap<String, Integer>();//有序LinkedHashMap<String,Integer> map2 = new LinkedHashMap<String, Integer>();for(int i = 0;i<str.length();i++) {String key = str.substring(i,i+1);//判断key是否存在if(map2.containsKey(key)) {//该字符(key)存在map2.put(key, map2.get(key)+1);}else {//该字符不存在map2.put(key, 1);}}System.out.println(map2);}
输出:
{q=5, u=5, r=2, f=4, k=1, j=4, c=1, b=1, s=1, d=3, p=1, i=1, h=5, v=6, l=2, a=2, y=3, g=2, o=1}
3.TreeMap类:
特点:①Key唯一,不允许重复②Value允许重复③按照Key自动排序④AbstractMap的子类
存储结构:树中的每个节点均是Entry内部类对象(红黑树)
例:按照key自动排序,通过key进行比较后排序!!!
public static void main(String[] args) {//HashMap:无序,按照key计算保存位置//HashMap<String,String> map = new HashMap<String,String>();// TreeMap:按照key自动排序,通过key进行比较后排序TreeMap<String, String> map = new TreeMap<String, String>();map.put("SN201", "A1");map.put("SN111", "A2");map.put("SN107", "A3");map.put("SN191", "A4");map.put("SN100", "A5");map.put("SN103", "A6");map.put("SN2011", "A7");map.put("SN1031", "A8");map.put("SN1231", "A9");for (Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey() + ":" + entry.getValue());}}
输出:
SN100:A5
SN103:A6
SN1031:A8
SN107:A3
SN111:A2
SN1231:A9
SN191:A4
SN201:A1
SN2011:A7
调用TreeMap<>()的有参构造方法,重写compare()方法,按照大小排序
public static void main(String[] args) {//HashMap:无序,按照key计算保存位置//HashMap<String,String> map = new HashMap<String,String>();// TreeMap:按照key自动排序,通过key进行比较后排序TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int n1 = Integer.parseInt(o1.substring(2));int n2 = Integer.parseInt(o2.substring(2));return n1 - n2;}});map.put("SN201", "A1");map.put("SN111", "A2");map.put("SN107", "A3");map.put("SN191", "A4");map.put("SN100", "A5");map.put("SN103", "A6");map.put("SN2011", "A7");map.put("SN1031", "A8");map.put("SN1231", "A9");for (Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey() + ":" + entry.getValue());}}
输出:
SN100:A5
SN103:A6
SN107:A3
SN111:A2
SN191:A4
SN201:A1
SN1031:A8
SN1231:A9
SN2011:A7
4.Hashtable类
特点:①Key唯一,不允许重复②Value允许重复③key 和 value不允许为空,如果为null,则抛出NullPointerExceptino④线程安全,使用synchronized加锁,性能较差
存储结构:数组+链表
- 允许使用null做key
- 不允许使用null做value
public static void main(String[] args) {HashMap<String, String> map=new HashMap<String, String>();map.put(null, "巴黎世家");//不允许使用null做keymap.put("AAA", null);//允许使用null做valueSystem.out.println(map);Hashtable<String, String> table=new Hashtable<String, String>();table.put(null, "巴黎世家");//不允许使用null做keytable.put("AAA", null);//不允许使用null做valueSystem.out.println(table);}
输出:
{null=巴黎世家, AAA=null}
Exception in thread "main" java.lang.NullPointerExceptionat java.util.Hashtable.put(Hashtable.java:465)at com.zad.day24_1_26_01.Text15.main(Text15.java:15)
相关文章:

Java集合-Map接口(key-value)
Map接口的特点:①KV键值对方式存储②Key键唯一,Value允许重复③无序。 Map有四个实现类:1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类: 存储结构:哈希表 数组Node[ ] 链表(红黑…...

【操作系统】实验九 写一个设备驱动程序
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…...

基于密码技术的身份认证——基于对称密码体制的身份认证
一、符号说明: A→B:表示通信实体A向通信实体B发送消息; Ek(x):表示用认证双方共享的密钥K对x进行加密; Text1,Text2,……,Text n属于可选项; ||:表示比特…...
算法36:单调栈结构、子数组最小乘积的最大值问题(力扣1586)----单调栈
单调栈:就是在栈中实现数据的单调性。即从栈底到栈顶,要么递增,要么递减。 那么,使用单调栈,可以解决什么问题呢? 给定一个可能含有重复值的数组arr,i位置的数一定存在如下两个信息 1&#x…...
django mysql in 有序返回
from django.db.models import * ordering f"FIELD(id, {,.join([str(_) for _ in ids])})" # 默认就按照算法返回的 id 排序p_data_result PeptidesDataResult.objects.using("polypeptide").filter(id__inids).values().extra(select{ordering: orderi…...

c++24.1.26嵌套if语句
嵌套if语句:if语句中的if语句 实践:...
机器学习--基础概念(二)
1.分类算法 分类算法是有监督学习的一个核心问题,他从数据中学习一个分类决策函数或分类模型,对新的输入进行预测,输出变量取有限个离散值。 以下是一些常见的分类算法: 逻辑回归 (Logistic Regression): 用于二分类问题&#x…...

Ubuntu20.04 安装 ROS noetic + MAVROS
本文在 AlphaCatOvO【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程 基础上,根据实际安装经验,稍微进行补充。 一、安装Ubuntu20.04 假设已经正确安装。 二、安装 ROS noetic 2.1 换源 执行 sudo apt update sudo mv /etc/apt/sources.list /etc/apt/…...

【数学笔记】一元n次不等式,分式不等式,绝对值不等式
不等式 基本性质 一元n次不等式一元二次不等式一元高次不等式分式不等式绝对值不等式 基本性质 性质 a > b ⇔ b < a a>b\Leftrightarrow b<a a>b⇔b<a a > b , b > c ⇒ a > c a>b,b>c\Rightarrow a>c a>b,b>c⇒a>c a > b ,…...
转载-android性能优化
android性能优化 Reason: Broadcast of Intent { actandroid.intent.action.TIME_TICK ActivityManager: ANR in com.***.*** PID: 16227 Reason: Broadcast of Intent { actandroid.intent.action.TIME_TICK flg0x50000014 (has extras) }有那么一段时间我被这个ANR折磨到每…...
笔记 | Clickhouse命令行查询
在 ClickHouse 中,可以使用命令行客户端执行查询。默认情况下,ClickHouse 的命令行客户端称为 clickhouse-client。下面是一些基本的步骤和示例,用于使用 clickhouse-client 进行查询。 首先,需要确保已经安装了 ClickHouse 服务…...

Dockerfile-xxxx
1、Dockerfile-server FROM openjdk:8-jdk-alpine WORKDIR /app COPY . . CMD java -Xms1536M -Xmx1536M -XX:UseG1GC -jar -Dlog4j2.formatMsgNoLookupstrue -Dloader.pathresources,lib -Duser.timezoneGMT-05 /app/server-main-1.0.0.jar 2、Dockerfile-bgd #FROM openjdk…...
Vue中的$attrs
今天产品经理要求做保留某组件全部功能,还要在它的基础上增加东西。如果不嫌麻烦的话就笨办法,但是想一下怎么只用少量代码高效的二次封装组件呢 Vue中的$attrs 在 Vue2 中,attr 是指组件接收的 HTML 特性(attribute),通过 prop…...

使用阿里云的oss对象存储服务实现图片上传(前端vue后端java详解)
一:前期准备: 1.1:注册阿里云账号,开启对象存储oss功能,创建一个bucket(百度教程多的是,跟着创建一个就行,创建时注意存储类型是标准存储,读写权限是公共读)…...
python实例100第32例:使用a[::-1]按相反的顺序输出列表的值
题目:按相反的顺序输出列表的值。 程序分析: a[n:-n]作用是去除前n个元素和末n个元素a[-n]作用是取倒数第n个元素a[:-n]的作用是去除后n个元素a[::-1]的作用是将所有元素逆序排列a[n::-1] 的作用是从第n个元素截取后逆序排列 程序…...
python执行脚本的时候获取输入参数
当我们执行脚本的时候,通常都会执行 python test.py -i xxx -o xxx,这里的 -i 和 -o 都是输入参数,这到底是怎么传递的呢? 本文纯粹记录一下 import argparseif __name__ __main__:print("hello")# 创建AugumentParser…...

Halcon指定区域的形状匹配
Halcon指定区域的形状匹配 文章目录 Halcon指定区域的形状匹配1.在参考图像中选择目标2.创建模板3.搜索目标 在这个实例中,会介绍如何根据选定的ROI选择合适的图像金字塔参数,创建包含这个区域的形状模板,并进行精确的基于形状模板的匹配。最…...

Linux——常用命令
1、命令的基本格式 对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务、开放更多的端口,这对服务器的稳定性和安全性都有负面影响。其实,服务器是一个连显示器都没有的家伙,要图形界面干什么ÿ…...

外包干了2个月,技术反而退步了...
先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

洛谷C++简单题练习day6—P1830 城市轰炸
day6--P1830 城市轰炸--1.26 习题概述 题目背景 一个大小为 nm 的城市遭到了 x 次轰炸,每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后,有 y 个关键点,指挥官想知道,它们有没有受到过轰炸,如果有&a…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...