09_Map集合

Map 集合

认识 Map 集合
  • Map 集合称为双列集合,格式 { key1 = value1, key2 = value2, key3 = value3e},它也被称为"键值对集合"

  • Map 集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能对应自己的值

Map 集合体系

特点:Map 系列集合的特点都是由键决定的,值只是一个附属品,值是不做要求的

  • HashMap:无序、不重复、无索引(用得最多)
  • LinkedHashMap:有序、不重复、无索引
  • TreeMap:按照大小默认升序排序,不重复,无索引
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;public class Test {public static void main(String[] args) {
//        Map<String, Integer> map = new HashMap<>();Map<String, Integer> map = new LinkedHashMap<>();  // 有序、不重复、无索引map.put("手表", 66);map.put("手表", 100);  // 后面重复的数据会覆盖前面的数据map.put("手机", 2);map.put("Java", 2);map.put(null, null);System.out.println(map);  // {手表=100, 手机=2, Java=2, null=null}Map<Integer, String> map1 = new TreeMap<>();  // 可排序、不重复、无索引map1.put(25, "Java");map1.put(31, "MySQL");map1.put(17, "Python");System.out.println(map1);  // {17=Python, 25=Java, 31=MySQL}}
}
Map 集合常用方法

Map 集合是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Test {public static void main(String[] args) {// 1. 添加元素Map<String, Integer> map = new HashMap<>();map.put("手表", 66);map.put("手表", 100);map.put("手机", 2);map.put("Java", 2);map.put(null, null);System.out.println(map);// {手表=100, 手机=2, Java=2, null=null}// 2. 获取集合大小System.out.println(map.size());// 3. 清空集合
//      map.clear();// 4. 判断是否为空System.out.println(map.isEmpty());// 5. 根据键获取对应值System.out.println(map.get("手表"));  // 100// 6. 根据键删除整个元素(删除键会返回键的值)System.out.println(map.remove("手表"));  // 100// 7. 判断是否包含某个键System.out.println(map.containsKey("手表"));// 8. 判断是否包含某个值System.out.println(map.containsValue(2));// 9. 获取Map集合的全部键Set<String> keys = map.keySet();System.out.println(keys);  // [null, Java, 手机]// 10. 获取Map集合的全部值Collection<Integer> values = map.values();System.out.println(values);  // [null, 2, 2]// 11. 把其他Map集合的数据,导入到自己集合中来Map<String, Integer> map1 = new HashMap<>();map1.put("java1", 10);map1.put("java2", 20);Map<String, Integer> map2 = new HashMap<>();map2.put("java3", 30);map2.put("java4", 40);map1.putAll(map2);  // 把map2集合中的元素全部导入到map1System.out.println(map2);  // {java4=40, java3=30}System.out.println(map1);  // {java4=40, java3=30, java2=20, java1=10}}
}
Map 集合的遍历
  • 方式一:键找值 ( 普通的方法 )
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Test {public static void main(String[] args) {// 准备一个Map集合Map<String, Double> map = new HashMap<>();map.put("Jack", 168.5);map.put("Tony", 178.8);map.put("Peter", 158.9);map.put("Tomato", 180.7);System.out.println(map);// {Tony=178.8, Peter=158.9, Jack=168.5, Tomato=180.7}// 1. 获取Map集合的所有键Set<String> keys = map.keySet();System.out.println(keys);  // [Tony, Peter, Jack, Tomato]// 2. 遍历所有的键,根据键获取其对应的值for (String key : keys) {System.out.println(key + " <=====> " + map.get(key));}// 运行结果
//        Tony <=====> 178.8
//        Peter <=====> 158.9
//        Jack <=====> 168.5
//        Tomato <=====> 180.7}
}
  • 方式二:键值对 (把"键值对"看成一个整体进行遍历)
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Test {public static void main(String[] args) {// 准备一个Map集合Map<String, Double> map = new HashMap<>();map.put("Jack", 168.5);map.put("Tony", 178.8);map.put("Peter", 158.9);map.put("Tomato", 180.7);System.out.println(map);// {Tony=178.8, Peter=158.9, Jack=168.5, Tomato=180.7}// 1. 获取Map集合提供的entrySet方法,把Map集合转成键值对类型的Set集合Set<Map.Entry<String, Double>> entries = map.entrySet();
//      entries 相当于是 =>  [(Tony=178.8), (Peter=158.9), (Jack=168.5), (Tomato=180.7)]for (Map.Entry<String, Double> entry : entries) {System.out.println((entry.getKey() + " <=====> " + entry.getValue()));}// 运行结果
//        Tony <=====> 178.8
//        Peter <=====> 158.9
//        Jack <=====> 168.5
//        Tomato <=====> 180.7}
}
  • 方式三:Lambda ( JDK 8 开始之后的新技术 )
import java.util.HashMap;
import java.util.Map;public class Test {public static void main(String[] args) {// 准备一个Map集合Map<String, Double> map = new HashMap<>();map.put("Jack", 168.5);map.put("Tony", 178.8);map.put("Peter", 158.9);map.put("Tomato", 180.7);System.out.println(map);// {Tony=178.8, Peter=158.9, Jack=168.5, Tomato=180.7}// lambda 表达式map.forEach((k, v) -> {System.out.println(k + " <=====> " + v);});// 运行结果
//        Tony <=====> 178.8
//        Peter <=====> 158.9
//        Jack <=====> 168.5
//        Tomato <=====> 180.7}
}
HashMap

特点:无序、不重复、无索引(用得最多)

底层原理:HashMap 跟 HashSet 的底层原理是一模一样的,都是基于哈希表实现的;实际上,原来学的 Set 系列集合的底层就是基于 Map 实现的,只是 Set 集合中的元素只要键数据,不要值数据而已。

LinkedHashMap

特点:有序、不重复、无索引

底层原理:底层数据结构依然是基于哈希表实现的,只是每个元素值对元素又额外的多了一个双链表的机制记录元素顺序(保证有序);实际上,原来学的 LinkedHashSet 集合的底层原理就是 LinkedHashMap 。

TreeMap

特点:按照大小默认升序排序,不重复,无索引

底层原理:TreeMap 跟TreeSet 集合的底层原理是一样的,都是基于红黑树实现排序。

// TreeMap 集合同样也支持指定比较规则import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;public class Test {public static void main(String[] args) {// 未简化模式
//        Map<Student, String> map = new TreeMap<>(new Comparator<Student>() {
//            @Override
//            public int compare(Student o1, Student o2) {
//                return Double.compare(o1.getScore(), o2.getScore());  // 升序
//            }
//        });// lambda 简化模式Map<Student, String> map = new TreeMap<>((o1, o2) -> Double.compare(o1.getScore(), o2.getScore());map.put(new Student("Jack", 66.5), "打篮球");map.put(new Student("Peter", 96.0), "敲代码");map.put(new Student("Tony", 86.5), "唱歌");System.out.println(map);// {Student{name='Jack', score=66.5}=打篮球, Student{name='Tony', score=86.5}=唱歌, Student{name='Peter', score=96.0}=敲代码}}
}class Student {private String name;private double score;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", score=" + score +'}';}public Student() {}public Student(String name, double score) {this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}
}

集合的嵌套(补充)

通过一个案例,快速理解与使用:

import java.util.*;public class Test {public static void main(String[] args) {/*** 要求用集合实现:* 江苏省 = "南京市", "扬州市", "苏州市", "无锡市", "常州市"* 湖北省 = "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市"* 河北省 = "石家庄", "唐山市", "邢台市", "保定市", "张家口"*/// 1. 创建外层集合Map<String, List<String>> map = new HashMap<>();// 2. 创建内层集合 + 内层集合填充数据List<String> lst1 = new ArrayList<>();Collections.addAll(lst1, "南京市", "扬州市", "苏州市", "无锡市", "常州市");// 3. 外层集合填充数据map.put("江苏省", lst1);// 其他部分List<String> lst2 = new ArrayList<>();Collections.addAll(lst2, "武汉市", "孝感市", "十堰市", "宜昌市", "鄂州市");map.put("湖北省", lst2);List<String> lst3 = new ArrayList<>();Collections.addAll(lst3, "石家庄", "唐山市", "邢台市", "保定市", "张家口");map.put("河北省", lst3);// 展示map.forEach((place, city) -> {System.out.println(place + ":" + city);});// 运行结果
//        江苏省:[南京市, 扬州市, 苏州市, 无锡市, 常州市]
//        湖北省:[武汉市, 孝感市, 十堰市, 宜昌市, 鄂州市]
//        河北省:[石家庄, 唐山市, 邢台市, 保定市, 张家口]}
}

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

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

相关文章

idea创建不了spring2.X版本,无法使用JDK8,最低支持JDK17 , 如何用idea创建spring2.X版本,使用JDK8解决方案

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;jdk17安装全方位手把手安装教程 / 已有jdk8了&#xff0c;安装JDK17后如何配置环境变量 / 多个不同版本的JDK&#xff0c;如何配置环境变量&a…

【开源】基于Vue.js的高校大学生创业管理系统的设计和实现

项目编号&#xff1a; S 027 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S027&#xff0c;文末获取源码。} 项目编号&#xff1a;S027&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创…

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用?11.28晚八点虹科直播间为您揭晓!

直播预告 | AR眼镜在现代医疗中究竟有哪些妙用&#xff1f;11.28晚八点虹科直播间为您揭晓&#xff01; 什么是AR眼镜&#xff1f; AR眼镜&#xff0c;即增强现实眼镜&#xff0c;是一种结合虚拟信息与真实世界的创新医疗工具。 通过集成高科技传感器和实时数据处理技术&…

【Python】使用globals()函数成功解决tkinter多个新窗口问题

我在近期的一个项目&#xff08;tkinter复刻记事本&#xff09;上遇到一个很有意思的问题&#xff1a;如何在创建多个新窗口后&#xff0c;每个窗口还能独立运行&#xff1f;当时我尝试几种方法&#xff0c;奈何实力不足&#xff0c;于是便下定结论非使用线程不可&#xff0c;至…

测试用例的设计思路

接到提测单后要做的事情&#xff1a; 确认提测单内包含的文件、URL地址可以访问确认需求 (迭代目标、用户故事、用户愿望、问题反馈等)确认回归测试范围、更新测试范围、新增测试范围编写测试点思维导图&#xff0c;过程中有问题及时进行沟通与迭代相关人员约一个时间, 开内部…

通付盾Web3专题 | SharkTeam:起底朝鲜APT组织Lazarus Group,攻击手法及洗钱模式

国家级APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&#xff09;组织是有国家背景支持的顶尖黑客团伙&#xff0c;专门针对特定目标进行长期的持续性网络攻击。朝鲜APT组织Lazarus Group就是非常活跃的一个APT团伙&#xff0c;其攻击目的主要以窃取资…

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中&#xff0c;事件监听器可以用于捕获和响应用户与页面交互的各种操作&#xff0c;如点击、滚动、输入等。 事件监听的基本原理是&#xff0c;通过在特定元素上注册事件监听器&#xff0c;当事件…

【深度学习】神经网络训练过程中不收敛或者训练失败的原因

在面对模型不收敛的时候&#xff0c;首先要保证训练的次数够多。在训练过程中&#xff0c;loss并不是一直在下降&#xff0c;准确率一直在提升的&#xff0c;会有一些震荡存在。只要总体趋势是在收敛就行。若训练次数够多&#xff08;一般上千次&#xff0c;上万次&#xff0c;…

免费SSL证书有效期只有90天?太短?

随着网络安全问题日益受到重视&#xff0c;SSL证书成为了网站安全的必需品。然而&#xff0c;在许多情况下&#xff0c;免费提供的SSL证书往往只有90天的有效期&#xff0c;这种期限对于很多用户来说显得过于短暂。 首先&#xff0c;我们要理解为什么 SSL 证书的有效期设定为90…

基于单片机DHT11湿度测量与控制-CO2-光照报警系统程序和仿真

一、系统方案 1、本设计采用这51单片机作为主控器。 2、DHT11温湿度、CO2、光照强度送到液晶1602显示。 3、按键设置报警值。 4、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 //初始化LCD*********************************…

LCR 047. 二叉树剪枝 和 leetCode 1110. 删点成林 + 递归 + 图解

给定一个二叉树 根节点 root &#xff0c;树的每个节点的值要么是 0&#xff0c;要么是 1。请剪除该二叉树中所有节点的值为 0 的子树。节点 node 的子树为 node 本身&#xff0c;以及所有 node 的后代。 示例 1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1] 解释: 只有红…

Nvidia VPI 双目相机生成深度图

nVidia VPI&#xff08;Vision Programming Interface&#xff09;提供了多种后端&#xff0c;用于执行图像处理和计算机视觉操作。不同的后端针对不同的硬件和用例进行了优化。这些后端包括&#xff1a; 1. CPU: 这是最通用的后端&#xff0c;它运行在标准的中央处理器&#…

【深度学习笔记】04 概率论基础

04 概率论基础 概率论公理联合概率条件概率贝叶斯定理边际化独立性期望和方差模拟投掷骰子的概率随投掷次数增加的变化 概率论公理 概率&#xff08;probability&#xff09;可以被认为是将集合映射到真实值的函数。 在给定的样本空间 S \mathcal{S} S中&#xff0c;事件 A \m…

Intellij Idea 断点小圆变成灰色怎么处理

场景1&#xff1a;变成了灰色实心圆 原因 断点变成灰色通常表示该断点处于失效状态。这可能是由于无意中点击了debug调试下方的“mute breakpoints”按钮导致的。 解决方案 依次点击设置小图标->View Options->Mute BreakPoints. 点击后 Mute BrakPoints左侧显示✔ 符号…

python之pyqt专栏5-信号与槽1

在上一篇文章&#xff0c;我们了解到如果想要用代码改变QLabel的文本内容&#xff0c;可以调用QLabel类的text()函数。 但是现在有个这样的需求&#xff0c;界面中有一个Button与一个Label&#xff0c;当点击Button时&#xff0c;将Label的内容改变为“Hello world&#xff01;…

算法通关村——数组加法

数组加法 1、数组实现整数加法 LeetCode66. 由整数组成的非空数组所表示的非负整数&#xff0c;在其基础上加一。这里最高位数字存放在数组的首位&#xff0c;数组中每个元素只存储单个数字。并且假设除了整数0之外&#xff0c;这个整数不会以0开头。 示例&#xff1a; 输入&…

【兔子王赠书第9期】ChatGPT进阶:提示工程入门

文章目录 写在前面ChatGPT推荐图书关键点编辑推荐内容简介推荐理由 粉丝福利写在后面 写在前面 人类一直在寻找、制造并使用工具&#xff0c;以扩展我们的能力&#xff0c;适应我们的环境&#xff0c;甚至超越我们的生物限制。现在&#xff0c;我们正站在一个历史性的分水岭之…

Jetpack Compose中适应性布局的新API

Jetpack Compose中适应性布局的新API 针对大屏幕优化的新组合件。 使用新的Material适应性布局&#xff0c;为手机、可折叠设备和平板电脑构建应用程序变得更加简单&#xff01;市场上各种不同尺寸的Android设备的存在挑战了构建应用程序时对屏幕尺寸的通常假设。开发者不应该…

c4d三维动画制作推荐 Cinema 4D 2024 中文for mac

功能介绍 场景管理器 Cinema 4D新内核的强大功能让您可以使用灵活的基于节点的资产来实现程序化的几何体创建、克隆等。 烟火 从Cinema 4D的任何物体或样条发射火焰、烟 雾和爆炸-加热&#xff01; 建模 引入用于重新拓扑的 ZRemesher、新的交互式建模工具、高级样条节点、对…

Kotlin中常见的List使用

文章目录 1.filter2.map3.count4.first,last5.any,all,none6.find&#xff0c;findLast7.indexOf()和lastIndexOf()查找元素下标8.Slice切片9.Take()和drop()获取指定长度 1.filter filter 就像其本意一样&#xff0c;可以通过 filter 对 Kotlin list 进行过滤。 fun main() …