当前位置: 首页 > news >正文

java进阶Map 集合

通过之前的学习我们知道Map是一个双列集合,就是以键值对的形式进行数据存储 java进阶—集合

Map 下面有 三个子接口,HashMap , HashTable 以及 TreeMap

提醒一点:Map不是Collection下的集合,Collection是单列集合(List,Set)

Map 的存储方式跟 list ,set 是不一样的,先来看看他的基本结构长什么样


Map<String,String> resultMap = new HashMap<>(3);

泛型里面,贴的标签是 键值对的类型 ,<键,值> ,括号里面的3 是设置这个Map 容器的大小 ,开发中一定要设置map的初始化大小,具体多少按需求而定

接下来我们一个一个来看

HashMap

可以说HashMap在开发中最常用,代码中随处可见,创建也很简单,new 一个 ,一样的集合创造出来了,不用就浪费了

  1. 添加(put)
Map<String,String> resultMap = new HashMap<>(3);resultMap.put("1号","去玩");resultMap.put("2号","去吃");resultMap.put("3号","睡觉");
  1. 移除(remove)

remove 是根据key 移除 value

  Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");resultMap.remove("1号");
  1. 是否存在这个Key(containsKey)
Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");boolean flag = resultMap.containsKey("3号");System.out.println(flag);

在这里插入图片描述

  1. 是否存在这个Value(containsValue)

Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");boolean flag = resultMap.containsValue("上班");System.out.println(flag);

在这里插入图片描述
4. 判断集合是否为空(isEmpty)

   Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");boolean flag = resultMap.isEmpty();System.out.println(flag);

在这里插入图片描述
5. 获取集合大小(size)

Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");int size = resultMap.size();System.out.println(size);

在这里插入图片描述
6. 遍历

map集合遍历这边介绍三种方式

entrySet (推荐使用)

 for (Map.Entry<String, String> entry : resultMap.entrySet()) {System.out.println(entry.getKey()+entry.getValue());}

在这里插入图片描述
keySet (不要使用,效率很低)

 Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");for (String s : resultMap.keySet()) {System.out.println("key="+s+"...."+"value="+resultMap.get(s));}

在这里插入图片描述

jdk1.8 forEach

  Map<String, String> resultMap = new HashMap<>(3);resultMap.put("1号", "去玩");resultMap.put("2号", "去吃");resultMap.put("3号", "睡觉");resultMap.forEach((k, v) -> {System.out.println(k+"..."+v);});

在这里插入图片描述
我们来做个实验,看看哪种遍历效率更高

我们先造100W的数据

int count = 1000000;long start = System.currentTimeMillis();Map<String, String> resultMap = new HashMap<>(count);for (int i = 1; i <= count; i++) {resultMap.put(i + "", i + " ---> map");}//效率对比,装载Map耗时System.out.println("装载map耗时: "+(System.currentTimeMillis()-start)+ " ms");//用entrySetstart = System.currentTimeMillis();for (Map.Entry<String, String> entry : resultMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();}System.out.println("用entrySet 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");//用keySetstart = System.currentTimeMillis();for (String s : resultMap.keySet()) {String key = s;String  value = resultMap.get(s);}System.out.println("用keySet 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");//用forEachstart = System.currentTimeMillis();resultMap.forEach((k, v) -> {String key  = k;String value = v;});System.out.println("用forEach 遍历 map耗时: "+(System.currentTimeMillis()-start)+ " ms");

输出

在这里插入图片描述
可以看到,entrySet效率是最高的 forEach 效率是最低的

当我们把数据调整到1000W时

int count = 10000000;long start = System.currentTimeMillis();Map<String, String> resultMap = new HashMap<>(count);for (int i = 1; i <= count; i++) {resultMap.put(i + "", i + " ---> map");}//效率对比,装载Map耗时System.out.println("装载map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用entrySetstart = System.currentTimeMillis();for (Map.Entry<String, String> entry : resultMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();}System.out.println("用entrySet 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用keySetstart = System.currentTimeMillis();for (String s : resultMap.keySet()) {String key = s;String  value = resultMap.get(s);}System.out.println("用keySet 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用forEachstart = System.currentTimeMillis();resultMap.forEach((k, v) -> {String key  = k;String value = v;});System.out.println("用forEach 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");

输出结果:

在这里插入图片描述
entrySet 的效率依然是最高的,foreach这边效率跟entry差不多了

将数据 换成1500W

int count = 15000000;long start = System.currentTimeMillis();Map<String, String> resultMap = new HashMap<>(count);for (int i = 1; i <= count; i++) {resultMap.put(i + "", i + " ---> map");}//效率对比,装载Map耗时System.out.println("装载map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用entrySetstart = System.currentTimeMillis();for (Map.Entry<String, String> entry : resultMap.entrySet()) {String key = entry.getKey();String value = entry.getValue();}System.out.println("用entrySet 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用keySetstart = System.currentTimeMillis();for (String s : resultMap.keySet()) {String key = s;String  value = resultMap.get(s);}System.out.println("用keySet 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");//用forEachstart = System.currentTimeMillis();resultMap.forEach((k, v) -> {String key  = k;String value = v;});System.out.println("用forEach 遍历 map耗时:"+(System.currentTimeMillis()-start)+ " ms");

在这里插入图片描述
可以看到forEach的效率是最高的,keySet 效率一直很低

总结: 对map进行遍历,建议使用 entrySet,数据量很庞大,千万级别,建议用forEach ,keySet不要用

HashTable

HashTable 不建议使用,就跟vector 跟arrayList 一样 ,其主要一个原因就是线程安全(这是个优点),但是它效率低

TreeMap

treeMap中的元素默认是按照key来进行自然排序的

对Integer来说,其自然排序就是数字的升序

对String来说,其自然排序就是按照字母表排序

主要体现在他的构造


public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

来看代码:

TreeMap<Integer, String> treeMap = new TreeMap<>();treeMap.put(1,"1号");treeMap.put(7,"7号");treeMap.put(6,"6号");treeMap.put(3,"3号");for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {System.out.println(entry.getKey()+"...."+entry.getValue());}

打印结果:

在这里插入图片描述
【最后来一个例子,加深对map集合的使用】

创建三个学生,有属性(姓名,年龄),给每个学生定义上整形编号, 保存在map中,并且遍历输出学生编号,姓名,年龄

public class Person {private String name;private Integer age;public Person(String name, Integer age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}
public static void main(String[] args) {Map<Integer, Person> treeMap = new HashMap<>(3);treeMap.put(1,new Person("zhangsan",18));treeMap.put(3,new Person("lisi",20));treeMap.put(4,new Person("wangwu",30));for (Map.Entry<Integer, Person> entry : treeMap.entrySet()) {System.out.println("编号:"+entry.getKey()+",姓名:"+entry.getValue().getName()+",年龄:"+entry.getValue().getAge());}}

执行结果:

在这里插入图片描述

相关文章:

java进阶Map 集合

通过之前的学习我们知道Map是一个双列集合&#xff0c;就是以键值对的形式进行数据存储 java进阶—集合 Map 下面有 三个子接口&#xff0c;HashMap &#xff0c; HashTable 以及 TreeMap 提醒一点&#xff1a;Map不是Collection下的集合&#xff0c;Collection是单列集合&am…...

Java 方法超详细整理,适合新手入门

目录 一、什么是方法呢&#xff1f; 二、方法的优点 三、带返回值方法定义 语法&#xff1a; 示例&#xff1a; 四、带返回值方法调用 语法&#xff1a; 示例&#xff1a; 五、结果示例 一、什么是方法呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行…...

软考学习笔记(题目知识记录)

答案为 概要设计阶段 本题涉及软件工程的概念 软件工程的任务是基于需求分析的结果建立各种设计模型&#xff0c;给出问题的解决方案 软件设计可以分为两个阶段&#xff1a; 概要设计阶段和详细设计阶段 结构化设计方法中&#xff0c;概要设计阶段进行软件体系结构的设计&…...

2021.3.3idea创建Maven项目

首先new - project - 找到Maven 然后按下图操作&#xff1a;先勾选使用骨架&#xff0c;再找到Maven-archetype-webapp&#xff0c;选中&#xff0c;然后next填写自己想要创建的项目名&#xff0c;然后选择自己的工作空间①、选择自己下载的Maven插件②、选择选择Maven里的sett…...

ASP.NET MVC | 创建应用程序

目录 首先 NO.1 No.2 App_Data 文件夹 Content 文件夹 Controllers 文件夹 Models 文件夹 Views 文件夹 Scripts 文件夹 最后 首先 一步一步的来&#xff0c;电脑上需要安装vs2019软件&#xff0c;版本高低无所谓&#xff0c;就是功能多少而已。 长这样的&#xff0…...

思科设备命令讲解(超基础)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…...

Qt-FFmpeg开发-保存视频流裸流(11)

Qt-FFmpeg开发-保存视频流裸流&#x1f4c0; 文章目录Qt-FFmpeg开发-保存视频流裸流&#x1f4c0;1、概述&#x1f4f8;2、实现效果&#x1f4bd;3、FFmpeg保存裸流代码流程&#x1f4a1;4、主要代码&#x1f50d;5、完整源代码&#x1f4d1;更多精彩内容&#x1f449;个人内容…...

Zebec官方辟谣“我们与Protradex没有任何关系”

近日&#xff0c;流支付协议Zebec Protocol在其官方推特上&#xff0c;发表了一个辟谣澄清声明。该条推特推文表示&#xff0c;“Zebec 与 Protradex 没有任何关系或产生关联。他们&#xff08; Protradex &#xff09;声称Zebec 生态正在支持他们&#xff0c;但这是错误的。随…...

BMS电池管理系统中的各种算法介绍

BMS电池管理系统 是一种用于电池组中的单个电池管理的系统&#xff0c;以确保其安全性、寿命和性能。BMS系统通过采集电池信息并对其进行分析&#xff0c;以确保电池组的正常运行。在BMS电池管理系统中&#xff0c;涉及到了许多算法&#xff0c;包括最大功率点追踪算法、SOC计算…...

stack Overflow 的使用

文章目录优雅的搜索1.1要在特定标签内搜索1.2搜索特定的短语1.3 限定检索位置1.4选择性屏蔽优雅的筛选搜索结果1. 返回的搜索筛选2. 特定时间段的帖子3. 精准的BOOL判断4. 其他的例子优雅的搜索 其实&#xff0c;在Stack OverFlow上的搜索方式&#xff0c;与国内的百度没什么大…...

Vue 在for循环中动态添加类名及style样式集合

介绍 在vue的 for 循环中&#xff0c;经常会使用到动态添加类名或者样式的情况&#xff0c;实现给当前的选中的 div 添加不同的样式。 动态添加类名 提示&#xff1a; 所有动态添加的类名&#xff0c;放在表达式里都需要添加引号&#xff0c;进行包裹。 通过 对象 的形式&a…...

Maven的优势

作用一&#xff1a;个人理解maven主要是用来解决导入java类依赖的jar,编译java项目主要问题。(最早手动导入jar&#xff0c;使用Ant之类的编译java项目)以pom.xml文件中dependency属性管理依赖的jar包&#xff0c;而jar包包含class文件和一些必要的资源文件。当然它可以构建项目…...

uboot,内核,根文件系统的作用

复习了下uboot&#xff0c;内核&#xff0c;根文件系统&#xff0c;简单概括下三者的主要内容。 1 uboot uboot的目的&#xff1a;启动内核。 uboot的功能可以分为两个阶段任务。 1.2.1 uboot第一阶段 uboot第一阶段主要负责硬件相关的初始化&#xff0c;主要在cpu/arm920…...

Vue3通透教程【四】Vue3组合API初体验

文章目录&#x1f31f; 写在前面&#x1f31f; 组合式 API 是什么&#xff1f;&#x1f31f; 直观组合式API&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技…...

coco数据集训练nanodet详细流程

github地址 首先要配置环境 conda create -n nanodet python3.8 -y conda activate nanodet确认一下cuda版本 nvcc -V确认是11.3之后&#xff0c;要安装11.3对应的pytorch版本。 本机装pytorch1.12.1后面运行的时候会报错&#xff08;torch没有经过cuda编译&#xff09;&…...

关于Kubernetes不兼容Docker

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/129153459 参考文献&#xff1a;https://www.cnblogs.com/1234roro/p/16892031.html 一、总结 总结起来就是一句话&#xff1a; k8s只是弃用了dockershim&#xff0c;并不是弃用了整个Docker&#xf…...

MySql_基础篇_从下载mysq到数据库操作

本笔记基于b站up主黑马程序员的视频整理 用于记录与回顾 数据库相关概念 数据库 DS 存储数据的仓库 数据库管理系统 DSMS 操纵和管理数据库的大型软件 sql 操作关系型数据库的编程语言是一套标准 mysql 默认端口号是3306 下载数据库 社区版下载 https://dev.mysql.com/…...

当我尝试问了chatGPT几个问题之后,我感到了危机......

问题1 &#xff1a; vue3 框架的bug有哪些&#xff1f; 组件内部的状态更新不及时&#xff1a;由于Vue3使用Proxy来实现响应式&#xff0c;在某些情况下&#xff0c;组件内部的状态更新不及时&#xff0c;导致组件的渲染出现问题。 组件内部的数据更新不及时&#xff1a;由于V…...

如何生成全局唯一ID

1.数据库自增ID 2.UUID 3.Redis生成ID 4.zookeeper生成ID 5.雪花算法...

基于node vue的电商系统 mongodb express框架

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 基于node vue的电商系统 mongodb express框架前言技术栈基本功能普通用户管理员一、运行截图&#xff1f;二、使用步骤1.前端main.js2.后端admin路由前言 技术栈 本项目采用…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...