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.mzph.cn/news/652195.shtml

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

相关文章

在windows环境下安装hadoop

Hadoop是一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。但这个架构是基于java语言开发的&#xff0c;所以要先进行jdk的安装&#xff0c;如果电脑已经配置过jdk或者是曾经运行成功过java文件&#xff0c;那就可以跳过第一步。 …

Jenkins上跑自动化项目,case出现错误时,导致项目运行时间过长,该如何处理?

1、方案一&#xff1a;Jenkins上调整 进入配置&#xff1a; 构建环境&#xff1a; 自行选择超时时间即可&#xff5e; 2、方案二&#xff1a;代码调整【python】 安装插件&#xff1a;pytest-timeout 选择一&#xff1a;装饰器用法&#xff1a;将单个测试用例标记为超时&…

【随谈】为什么高端开发岗要求研究过源码?如何研究?

今天来聊一个简单的问题&#xff1a;研究源码有什么用&#xff1f; 不知道你是否注意过&#xff0c;如果找薪资3万以上的岗位&#xff0c;往往都要求研究过框架和中间件源码的优先考虑。 我们随便选几个例子&#xff1a; 这里条件虽然写了很多&#xff0c;但是最重要的都是要…

Hadoop集群部署流程

前置要求 需要3台虚拟机&#xff0c;系统为Centos7&#xff0c;分别host命名为node1&#xff0c;node2&#xff0c;node3&#xff0c;密码均为root请确保这三台虚拟机已经完成了JDK、SSH免密、关闭防火墙、配置主机名映射等前置操作 在3台虚拟机的/etc/hosts文件中&#xff0…

【Docker】快速入门手册

目录 1.概述 1.1.安装 1.2.阿里云镜像加速 1.3.运行原理 2.常用操作 2.1.帮助命令 2.2.镜像操作 2.3.容器操作 2.3.1创建、启动 2.3.2.退出、停止 2.3.3.进入交互式界面 2.3.4.守护式容器交互 2.3.5.查看 2.3.6.删除 2.3.7.拷贝 3.容器数据卷 3.1.概述 3.2.使…

网页转文件下载工具

为了更快捷copy博客 做了个 网页转文件下载工具 1.0.1 更新如下&#xff1a; javaphpjava提供页面转换文件的微服务APIphp调用接口&#xff0c;输出文件下载支持网页转md 1.0.2 更新如下&#xff1a; 样式表切换&#xff0c;白天or黑夜&#xff0c;cookie七天保质期 未…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…

Java技术栈 —— Hadoop入门(二)

Java技术栈 —— Hadoop入门&#xff08;二&#xff09; 一、用MapReduce对统计单词个数1.1 项目流程1.2 可能遇到的问题1.3 代码勘误1.4 总结 一、用MapReduce对统计单词个数 1.1 项目流程 (1) 上传jar包。 (2) 上传words.txt文件。 (3) 用hadoop执行jar包的代码&#xff0c;…

RNN预测下一句文本简单示例

根据句子前半句的内容推理出后半部分的内容&#xff0c;这样的任务可以使用循环的方式来实现。 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种用于处理序列数据的强大神经网络模型。与传统的前馈神经网络不同&#xff0c;RNN能够通过其…

32GPIO输入LED闪烁蜂鸣器

一.GPIO简介 所有的GPIO都挂载到APB2上&#xff0c;每个GPIO有&#xff11;&#xff16;个引脚 内核可以通过APB&#xff12;对寄存器进行读写&#xff0c;寄存器都是32位的&#xff0c;但每个引脚端口只有&#xff11;&#xff16;位 驱动器用于增加信号的驱动能力 二.具体…

【Go】深入理解 Go map:赋值和扩容迁移 ①

文章目录 map底层实现hmapbmap map hash冲突了怎么办&#xff1f; map扩容触发扩容时机扩容小结为什么map扩容选择增量&#xff08;渐进式扩容&#xff09;&#xff1f;迁移是逐步进行的。那如果在途中又要扩容了&#xff0c;怎么办&#xff1f; map翻倍扩容原理 map写入数据内…

数据库查询3

目录 1. 多表查询 1.1.1 介绍 1.1.2 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 2. 事务 2.1 操作 2.2 四大特性 数据库总结2 数据库总结1 1. 多表查询 1.1.1 介绍 多表查询&#xff…

研发日记,Matlab/Simulink避坑指南(七)——数据溢出钳位Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(二)——非对称数据溢出Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(三)——向上取整Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑…

C语言第十一弹---函数(下)

​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、嵌套调用和链式访问 1.1、嵌套调用 1.2、链式访问 2、函数的声明和定义 2.1、单个文件 2.2、多个文件 2.3、static 和 extern 2.3.1、static…

【自然语言处理】【深度学习】文本向量化、one-hot、word embedding编码

因为文本不能够直接被模型计算&#xff0c;所以需要将其转化为向量 把文本转化为向量有两种方式&#xff1a; 转化为one-hot编码转化为word embedding 一、one-hot 编码 在one-hot编码中&#xff0c;每一个token使用一个长度为N的向量表示&#xff0c;N表示词典的数量。 即&…

dos攻击与ddos攻击的区别

①DOS攻击&#xff1a; DOS&#xff1a;中文名称是拒绝服务&#xff0c;一切能引起DOS行为的攻击都被称为dos攻击。该攻击的效果是使得计算机或网络无法提供正常的服务。常见的DOS攻击有针对计算机网络带宽和连通性的攻击。 DOS是单机于单机之间的攻击。 DOS攻击的原理&#…

【GitHub项目推荐--常见的国内镜像】【转载】

由于国内网络原因&#xff0c;下载依赖包或者软件&#xff0c;对于不少互联网从业者来说&#xff0c;都有不小的挑战&#xff0c;时间浪费在这上边&#xff0c;实在可惜。这个项目介绍了常见依赖&#xff0c;软件的国内镜像&#xff0c;助力大家畅爽编码。 这是一个归纳梳理类…

C# 将HTML网页、HTML字符串转换为PDF

将HTML转换为PDF可实现格式保留、可靠打印、文档归档等多种用途&#xff0c;满足不同领域和情境下的需求。本文将通过以下两个示例&#xff0c;演示如何使用第三方库Spire.PDF for .NET和QT插件在C# 中将Html 网页&#xff08;URL&#xff09;或HTML字符串转为PDF文件。 HTML转…

【C语言/数据结构】排序(选择排序,推排序,冒泡排序)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​​ 目录 选择排序 选择排序 ​编辑…

js实现动漫拼图2.0版

比较与1.0版&#xff0c;2.0版就更像与华容道类似的拼图游戏&#xff0c;从头到尾都只能控制白色块移动&#xff0c;而且打乱拼图和求助的实现与1.0都不相同 文章目录 1 实现效果2 实现思路2.1 打乱拼图2.2 求助功能2.3 判赢 3 代码实现 js实现动漫拼图1.0版 https://blog.csdn…