Java集合-Map接口(key-value)

news2024/11/16 17:35:07

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)

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

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

相关文章

雨云美国二区云服务器评测

雨云美国二区云服务器评测 官网直接百度搜索雨云就行 我买的时候比较便宜&#xff0c;三个月3.4元&#xff0c;1C1G对于我这种小网站来说够用了 本期测评服务器配置 CPU&#xff1a;1核 内存&#xff1a;1G 硬盘&#xff1a;Linux系统20G&#xff0c;win系统30G 流量&…

Qt中Widget样式表实现圆弧边框

第一步 第二步 第三步 第四步 //插入border-radius: 10px; border: 2px solid #000; 效果图

Elasticsearch介绍以及基本操作

目录 一、Elasticsearch介绍 二、关于Elasticsearch的基本操作 &#xff08;1&#xff09;索引操作 &#xff08;2&#xff09;文档操作 三、域的属性 &#xff08;1&#xff09;index &#xff08;2&#xff09;type &#xff08;3&#xff09;store 一、Elasticsearc…

vue3+elementPlus pc和小程序ai聊天文生图

websocket封装可以看上一篇文章 //pc端 <template><div class"common-layout theme-white"><el-container><el-aside><div class"title-box"><span>AI Chat</span></div><div class"chat-list&…

使用vue_cli脚手架创建Vue项目(cmd和图形化方式)

使用vue_cli脚手架创建Vue项目&#xff08;cmd和图形化方式&#xff09; 创建项目(cmd方式) vue create vue_cli1.方向键选择manually select feature(手动选择方式创建)&#xff0c;回车 2.按空格键选择需要的组件&#xff1a;Babel、PWA、Router、Vuex、CSS&#xff0c;回…

【LeetCode】112. 路径总和(简单)——代码随想录算法训练营Day18

题目链接&#xff1a;112. 路径总和 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&…

Pandas.Series.product() 乘积(累乘积) 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

以太网与PON网络的巅峰对决

在这网络的江湖中&#xff0c;各路江湖豪侠都神色匆忙地往同一个地方赶&#xff0c;豪侠们脸上都充满期待和焦虑&#xff0c;生怕错过了什么。这个地方就是传说中的园区网&#xff0c;因为在那里万众期待已久的以太网与PON网络的巅峰对决“将在今天上演。 一方是以太网大侠&am…

500行Python代码构建的AI搜索工具!

一个500行Python代码构建的AI搜索工具&#xff0c;而且还会开源&#xff0c;试了一下麻雀虽小该有的都有。 后端是Mixtral-8x7b 模型&#xff0c;托管在 LeptonAI 上&#xff0c;输出速度能达到每秒大约200个 token&#xff0c;用的搜索引擎是 Bing 的搜索 API。 作者还写了一…

【昕宝爸爸小模块】什么是POI,为什么它会导致内存溢出?

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

六、Kotlin 类型进阶

1. 类的构造器 & init 代码块 1.1 主构造器 & 副构造器在使用时的注意事项 & 注解 JvmOverloads 推荐在类定义时为类提供一个主构造器&#xff1b; 在为类提供了主构造器的情况下&#xff0c;当再定义其他的副构造器时&#xff0c;要求副构造器必须调用到主构造器…

2024年预制菜行业市场发展趋势分析(2021-2023年预制菜行业数据分析)

近期&#xff0c;老干妈被称为预制菜、预制菜国标报送稿出炉等事件再次引起大众对于预制菜市场的讨论。随着国家对预制菜审核标准的严格化&#xff0c;预制菜市场未来走向将会如何&#xff1f;鲸参谋带大家从数据角度来了解。 首先来看下预制菜市场的行业发展情况。 根据鲸参…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Python第三方扩展库NumPy

Python第三方扩展库NumPy NumPy(Numerical Python&#xff0c;注意使用时全部小写 numpy) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 在Windows平台上安装numpy&#xff0c;可在cmd命令…

python使用PaddleOCR实现《命名实体识别项目》OCR(已实现)(ai领域必看,简单易用)

1.简介&#xff1a; PaddleOCR是飞桨&#xff08;PaddlePaddle&#xff09;推出的一个端到端的光学字符识别开源工具集&#xff0c;支持中文、英文、数字以及特殊符号等各种类型的文字检测、识别和词语整体识别。该工具集使用PaddlePaddle深度学习框架技术&#xff0c;提供了多…

jenkins发布失败

今天用jenkins发布项目时失败了&#xff0c;而前几天还好好的。 云控制台看了下&#xff0c;发现根本就没打包。 报错如下&#xff1a; 从控制台可以看出&#xff0c;项目依赖没有下载下来&#xff0c;所以打包失败了。 根本原因是&#xff1a;在配置中给yarn指定的淘宝仓库…

day31_HTML

今日内容 0 复习昨日 1 表格标签 2 表单标签【重要】 3 框架标签 0 复习昨日 Javaweb开发,前端,服务器,数据库 前端,要学习HTML,CSS,JavaScript,JQuery HTML是用来编写网页的一种编程语言 语法 由各种标签组成,标签是尖括号<>,一般都是成对儿出现,前面叫做开标签,后面…

【代码随想录-数组】移除元素

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

OJAC近屿智能张立赛博士揭秘GPT Store:技术创新、商业模式与未来趋势

Look&#xff01;&#x1f440;我们的大模型商业化落地产品&#x1f4d6;更多AI资讯请&#x1f449;&#x1f3fe;关注Free三天集训营助教在线为您火热答疑&#x1f469;&#x1f3fc;‍&#x1f3eb; 亲爱的伙伴们&#xff1a; 1月31日晚上8:30&#xff0c;由哈尔滨工业大学的…

【数据结构】栈、队列、数组、列表

数据结构是什么&#xff1f; 数据结构是计算机存储、组织数据的方式 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。一般情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者…