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)

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

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

相关文章

STM32的GPIO的详细配置指南

1. GPIO简介 GPIO&#xff08;General Purpose Input/Output&#xff09;是用于在微控制器中与外部世界通信的接口。通过GPIO&#xff0c;微控制器可以控制外部设备&#xff08;如LED、LCD、按键等&#xff09;的状态&#xff0c;也可以接收外部设备的状态&#xff08;如传感器…

用AI工具一键生成原创文案的方法

一键生成原创文案对于文案工作者来说它是一种高效率创作文案内容的方法。文案工作者知道创作文案是一件消耗精力和时间的事情&#xff0c;遇到没有创作灵感&#xff0c;想要写一篇高质量的文案内容简直难上加难&#xff0c;因此&#xff0c;互联网上出现了一键生成原创文案的方…

Linux下安装edge

edge具有及其强大的功能&#xff0c;受到很多人的喜爱&#xff0c;它也开发Linux版本&#xff0c;下面是安装方法&#xff1a; 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令&#xff08;后面是安装…

【算法专题】贪心算法

贪心算法 贪心算法介绍1. 柠檬水找零2. 将数组和减半的最少操作次数3. 最大数4. 摆动序列(贪心思路)5. 最长递增子序列(贪心算法)6. 递增的三元子序列7. 最长连续递增序列8. 买卖股票的最佳时机9. 买卖股票的最佳时机Ⅱ(贪心算法)10. K 次取反后最大化的数组和11. 按身高排序12…

WPOpenSocial实现WordPress的QQ登录

个人建站不可避免的需要自己搭建用户数据库的问题&#xff0c;可用户却往往因为注册繁琐而放弃浏览您的网站&#xff0c;由此可见&#xff0c;一个社交账号一键登录方式尤为重要。选择适合您网站需求的社交插件&#xff0c;可以提升用户互动&#xff0c;增加社交分享&#xff0…

【C++】类和对象(一)

前言&#xff1a;在前面我们带大家初步步入了C&#xff0c;让大家大概知道了他的样子&#xff0c;那今天就可以说我们要正式步入C的大门了&#xff0c;这一章内容的细节比较多各位学习的时候一定要仔细。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f…

Flink实战三_TableAPISQL

接上文&#xff1a;Flink实战二_DataStream API 1、Table API和SQL是什么&#xff1f; 接下来理解下Flink的整个客户端API体系&#xff0c;Flink为流式/批量处理应用程序提供了不同级别的抽象&#xff1a; 这四层API是一个依次向上支撑的关系。 Flink API 最底层的抽象就是有…

AR眼镜_ar智能眼镜显示方案|光学方案

AR眼镜是一种智能眼镜&#xff0c;能够将虚拟现实和现实世界相结合&#xff0c;使人们能够在日常生活中体验和参与虚拟现实。然而&#xff0c;AR智能眼镜的制造成本高&#xff0c;开发周期长。要实现AR眼镜的各项功能&#xff0c;需要良好的硬件条件&#xff0c;而AR智能眼镜的…

大专生能不能学习鸿蒙开发?

目前安卓有2,000万的开发者。本科及以上学历占比为35%&#xff1b;iOS有2,400万开发者&#xff0c;本科及以上学历占比为40% 绝大多数的前端开发者都是大专及以下学历&#xff0c;在2023年华为开发者大会上余承东透露华为的开发者目前有200万&#xff0c;但鸿蒙开发者统计的数据…

【Lazy ORM 整合druid 实现mysql监控】

Lazy ORM 整合druid 实现mysql监控 JDK 17 Lazy ORM框架地址 up、up欢迎start、issues 当前项目案例地址 框架版本描述spring-boot3.0.7springboot框架wu-framework-web1.2.2-JDK17-SNAPSHOTweb容器Lazy -ORM1.2.2-JDK17-SNAPSHOTORMmysql-connector-j8.0.33mysql驱动druid-…

Mac截图软件CleanShot X为什么不能识别文字?CleanShot X文字识别教程

好多朋友在使用CleanShot X for Mac截图软件过程中发现不能进行OCR文字识别&#xff1f;其实这是因为你没有给CleanShot X相应的权限导致的&#xff0c;具体操作如下&#xff1a; 第一步、打开&#xff0c;系统偏好设置-隐私与安全设置-完全磁盘访问权限 点击左下方➕ 在应用程…

vue2 国际化的使用,自动翻译文件,自动生成国际化文件

vue2 国际化的使用&#xff0c;自动翻译文件&#xff0c;自动生成国际化文件 npm i vue-i18n6 文件代码 // zh.js 用来写全局通用的国际化 export default {home:"首页" }//en.js 用来写全局通用的国际化 export default {home:"home page" }//kor.js …

Security ❀ HTTP/HTTPS逐包解析交互过程细节

文章目录 1. TCP三次握手机制2. HTTP Request 请求报文3. HTTP Response 响应报文4. SSL/TLS协议4.1. ClientHello 客户端Hello报文4.2 ServerHello 服务器Hello报文4.3. *ServerKeyExchange 服务公钥交换4.4. ClientKeyExchange 客户端公钥交换4.5. *CertificateVerify 证书验…

蓝桥杯---九数组分数

1,2,3 ... 9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码。 注意,只能填写缺少的部分,不要重复抄写已有代码。不要填写任何多余的文字。 代码 public class _05九数组分数 {public static void test(int[] x){int a …

[网鼎杯 2018]Fakebook1

join一个用户后&#xff0c;点进去发现是这样的 查看这个页面的源代码&#xff0c;发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址&#xff0c;从而回显出来呢&#xff1f;当然&#xff0c;先按照常规sqli…

C语言应用实例——贪吃蛇

&#xff08;图片由AI生成&#xff09; 0.贪吃蛇游戏背景 贪吃蛇游戏&#xff0c;最早可以追溯到1976年的“Blockade”游戏&#xff0c;是电子游戏历史上的一个经典。在这款游戏中&#xff0c;玩家操作一个不断增长的蛇&#xff0c;目标是吃掉出现在屏幕上的食物&#xff0c…

物联网IOT视频设备如何快速对接阿里云生活物联网(Link Visual)并成功上云?

原文永久更新地址&#xff1a;https://www.yundashi168.com/472.html 文章来源&#xff1a;猿视野 如果有图片看不清楚&#xff0c;加载不出来&#xff0c;请阅读原文。 什么是Link Visual、 Link Visual是生活物联网平台针对视频产品推出的增值服务&#xff0c;提供视频数据上…

第一节 分布式架构设计理论与Zookeeper环境搭建

目录 1. 分布式架构设计理论 1. 分布式架构介绍 1.1 什么是分布式 1.2 分布式与集群的区别 1.3 分布式系统特性 1.4 分布式系统面临的问题 2. 分布式理论 2.1 数据一致性 2.1.1 什么是分布式数据一致性 2.1.2 副本一致性 2.1.3 一致性分类 2.2 CAP定理 2.2.1 CAP定…

Habitat环境学习二:导航任务中的Habitat-sim基础Habitat-sim Basics for Navigation

导航任务在Habitat-sim任务中的实现 官方教程概述重要概念1、Hello World程序1.0.1 基础设置Basic settings1.0.2 模拟器设置Configurations for the simulator1.0.3 创建模拟器实例1.0.4 初始化Agent1.0.5 导航和探索 官方教程 Habitat是一个高效的真实的3D模拟器&#xff0c…

【C++进阶】STL容器--list使用迭代器问题分析

目录 前言 1. list的基本使用 1.1 list构造函数 1.2 list迭代器 1.3 list capacity 1.4 list元素访问 1.5 list 修改操作 insert erase swap resize clear 2. list失效迭代器问题 3. list使用算法库函数问题 总结 前言 list&#xff08;链表&#xff09;在C中非常重要…