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不存在,则返回null
	System.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,返回旧value
	System.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.NullPointerException
	at 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获取对应的value
		Set<String> keys = map.keySet();//获取map中所有的key
		
		System.out.println("所有的key:"+keys);
		System.out.println("按照每个key,获取对应的value");
		
		Iterator<String> it = keys.iterator();
		while(it.hasNext()) {
			String key = it.next();//获取每个key
			String[] val = map.get(key);//按照key获取对应的value
			System.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:获取所有的value
		Collection<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>() {

			@Override
			public 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做key
		map.put("AAA", null);//允许使用null做value
		System.out.println(map);
		
		Hashtable<String, String> table=new Hashtable<String, String>();
		table.put(null, "巴黎世家");//不允许使用null做key
		table.put("AAA", null);//不允许使用null做value
		System.out.println(table);
		}

输出:

{null=巴黎世家, AAA=null}
Exception in thread "main" java.lang.NullPointerException
	at java.util.Hashtable.put(Hashtable.java:465)
	at com.zad.day24_1_26_01.Text15.main(Text15.java:15)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暴力破解

暴力破解工具使用汇总 1.查看密码加密方式 在线网站&#xff1a;https://cmd5.com/ http://www.158566.com/ https://encode.chahuo.com/kali&#xff1a;hash-identifier2.hydra 用于各种服务的账号密码爆破&#xff1a;FTP/Mysql/SSH/RDP...常用参数 -l name 指定破解登录…

BUUCTF--xor1

这题考察的是亦或。查壳&#xff1a; 无壳。看下IDA的流程&#xff1a; 我们看到将用户输入做一个异或操作&#xff0c;然后和一个变量做比较。如果相同则输出Success。这里的知识点就是两次异或会输出原文。因此我们只需要把global再做一次异或就能解出flag。在IDA中按住shift…

Excel 2019 for Mac/Win:商务数据分析与处理的终极工具

在当今快节奏的商业环境中&#xff0c;数据分析已经成为一项至关重要的技能。从市场趋势预测到财务报告&#xff0c;再到项目管理&#xff0c;数据无处不在。而作为数据分析的基石&#xff0c;Microsoft Excel 2019 for Mac/Win正是一个强大的工具&#xff0c;帮助用户高效地处…

鸿蒙HarmonyOS获取GPS精确位置信息

参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…

RabbitMQ 笔记二

1.Spring 整合RabbitMQ 生产者消费者 创建生产者工程添加依赖配置整合编写代码发送消息 创建消费者工程添加依赖配置整合编写消息监听器 2.创建工程RabbitMQ Producers spring-rabbitmq-producers <?xml version"1.0" encoding"UTF-8"?> <pr…

[TCP协议]基于TCP协议的字典服务器

目录 1.TCP协议简介: 2.TCP协议在Java中封装的类以及方法 3.字典服务器 3.1服务器代码: 3.2客户端代码: 1.TCP协议简介: TCP协议是一种有连接,面向字节流,全双工,可靠的网络通信协议.它相对于UDP协议来说有以下几点好处: 1.它是可靠传输,相比于UDP协议,传输的数据更加可靠…

两个近期的计算机领域国际学术会议(软件工程、计算机安全):欢迎投稿

近期&#xff0c;受邀担任两个国际学术会议的Special session共同主席及程序委员会成员&#xff08;TPC member&#xff09;&#xff0c;欢迎广大学界同行踊跃投稿&#xff0c;分享最新研究成果。期待这个夏天能够在夏威夷檀香山或者加利福尼亚圣荷西与各位学者深入交流。 SERA…

深度学习-搭建Colab环境

Google Colab(Colaboratory) 是一个免费的云端环境&#xff0c;旨在帮助开发者和研究人员轻松进行机器学习和数据科学工作。它提供了许多优势&#xff0c;使得编写、执行和共享代码变得更加简单和高效。Colab 在云端提供了预配置的环境&#xff0c;可以直接开始编写代码&#x…

React中使用LazyBuilder实现页面懒加载方法二

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

【网络协议测试】畸形数据包——圣诞树攻击(DOS攻击)

简介 TCP所有标志位被设置为1的数据包被称为圣诞树数据包&#xff08;XMas Tree packet&#xff09;&#xff0c;之所以叫这个名是因为这些标志位就像圣诞树上灯一样全部被点亮。 标志位介绍 TCP报文格式&#xff1a; 控制标志&#xff08;Control Bits&#xff09;共6个bi…

【虚拟机数据恢复】异常断电导致虚拟机无法启动的数据恢复案例

虚拟机数据恢复环境&#xff1a; 某品牌R710服务器MD3200存储&#xff0c;上层是ESXI虚拟机和虚拟机文件&#xff0c;虚拟机中存放有SQL Server数据库。 虚拟机故障&#xff1a; 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失&#xff0c;所幸…

JPDA框架和JDWP协议

前言 在逆向开发中,一般都需要对目标App进行代码注入。主流的代码注入工具是Frida,这个工具能稳定高效实现java代码hook和native代码hook,不过缺点是需要使用Root设备,而且用js开发,入门门槛较高。最近发现一种非Root环境下对Debug App进行代码注入的方案,原理是利用Jav…

Unity MonoBehaviour 生成dll

dllllllllllllll&#x1f953; &#x1f959;vs创建类库项目&#x1f9c0;添加UnityEngine、UnityEditor引用&#x1f355;添加MonoBehaviour类&#x1f9aa;设置dll生成路径&#x1f37f;生成dll&#x1f354;使用dll中的Mono类 &#x1f959;vs创建类库项目 &#x1f9c0;添加…

qiankun子应用静态资源404问题有效解决(涉及 css文件引用图片、svg图片无法转换成 base64等问题)

在&#x1f449;&#x1f3fb; qiankun微前端部署&#x1f448;&#x1f3fb;这个部署方式的前提下&#xff0c;遇到的问题并解决问题的过程 最开始的问题现象 通过http请求本地的静态json文件404css中部分引入的图片无法显示 最开始的解决方式 在&#x1f449;&#x1f3…

YOLO系列(YOLO1-YOLO5)技术规格、应用场景、特点及性能对比分析

文章目录 前言一、YOLOv1-YOLOv5技术规格对比&#xff1a;二、主要应用场景和特点&#xff1a;三、性能对比分析&#xff1a;四、市场应用前景及对不同用户群体的潜在影响&#xff1a;总结 前言 YOLO&#xff08;You Only Look Once&#xff09;系列模型作为一种实时目标检测算…

OpenAI 降低价格并修复拒绝工作的“懒惰”GPT-4,另外ChatGPT 新增了两个小功能

OpenAI降低了GPT-3.5 Turbo模型的API访问价格&#xff0c;输入和输出价格分别降低了50%和25%。这对于使用API进行文本密集型应用程序的用户来说是一个好消息。 OpenAI官网&#xff1a;OpenAI AIGC专区&#xff1a;aigc 教程专区&#xff1a;AI绘画&#xff0c;AI视频&#x…

npm,cnpm install报:Error: certificate has expired at TLSSocket.onConnectSecure

问题描述 最近发现前端项目 CI/CD 时失败&#xff0c;报下面的错误。npm淘宝镜像源证书过期导致的。 [npminstall:get] retry GET https://registry.npm.taobao.org/vue-router after 400ms, retry left 1, error: ResponseError: certificate has expired, GET https://reg…

【Unity小技巧】一个脚本实现控制3D远程/近战敌人AI

最终效果 文章目录 最终效果烘培导航地图配置敌人导航数据简单配置敌人动画敌人AI脚本完结 想了解导航的其他内容可以看我这篇文章&#xff1a;【Unity游戏开发教程】零基础带你从小白到超神29——导航系统 烘培导航地图 选中地面&#xff0c;设置为静态导航 点击烘培&#xf…

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

写静态页面——魅族声学_前端页面练习

1、效果: 1、html代码: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>魅族声学</titl…