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;那就可以跳过第一步。 …

想用verilog写一个npu 需要什么学习路线?

要用Verilog编写一个NPU&#xff08;神经处理单元&#xff09;&#xff0c;你需要经过以下学习路线&#xff1a; 数字电路基础&#xff1a; 学习数字电路的基本概念&#xff0c;包括逻辑门、寄存器、时钟信号、信号传输等。 Verilog编程语言&#xff1a; 学习Verilog HDL&…

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

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

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

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

编程笔记 html5cssjs 063 JavaScrip输出

编程笔记 html5&css&js 063 JavaScrip输出 一、JavaScript 输出方式二、弹出警告框来显示数据三、操作 HTML 元素四、写到 HTML 文档五 、写到控制台小结 JavaScript 输出。JavaScript 没有任何打印或者输出的函数。JavaScript输出主要是显示数据&#xff0c;以使我们看…

Hadoop集群部署流程

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

Java Card调试系统

近年来,嵌入式系统发展迅猛,已经广泛的渗透到了人们日常生活的方方面面中。由于市场对嵌入式系统要求越来越细致深入,致使其开发也越来越复杂。市场日益激烈的竞争趋势致使对嵌入式系统开发周期的要求不断提高,这时支撑软件高效开发的嵌入式开发工具特别是调试工具就显得至关重…

【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能够通过其…

第十二届“中关村青联杯”全国研究生数学建模竞赛-D题:面向节能的单/多列车优化决策问题(续)

目录 5.3 240 列列车节能运行优化控制模型 5.3.1 模型描述 5.3.2 模型求解 6 问题三分析

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…

Compose | UI组件(四) | Icon(),Image() 图标和图片组件

文章目录 Icon 图标组件简介Icon 图标组件例子 Image 图片组件简介Image 图片组件例子colorFilter 实现不同效果 总结 Icon 图标组件简介 显示一系列图标 Composable fun Icon(imageVector: ImageVector, //矢量图,可以显示SVG格式的图标contentDescription: …

1170. 排队布局(差分约束,spfa,负环)

1170. 排队布局 - AcWing题库 当排队等候喂食时&#xff0c;奶牛喜欢和它们的朋友站得靠近些。 农夫约翰有 N 头奶牛&#xff0c;编号从 1 到 N&#xff0c;沿一条直线站着等候喂食。 奶牛排在队伍中的顺序和它们的编号是相同的。 因为奶牛相当苗条&#xff0c;所以可能有两…

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

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

【每日一题】YACS 243:5G通讯

题目描述 这是上海计算机学会竞赛 P 243 P243 P243&#xff1a;5G通讯&#xff08; 2020 2020 2020年 9 9 9月月赛 乙组 T 2 T2 T2&#xff09;标签&#xff1a;二分查找题意&#xff1a;给定 n n n个点&#xff0c;第 i i i个点的坐标为 x i x_i xi​。给定限制 d d d&#…