当前位置: 首页 > 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路由前言 技术栈 本项目采用…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...