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

JavaSE22——HashMap

集合框架_HashMap

一、概述

HashMap 是用于存储 Key-Value 键值对的集合。
(1)HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,所以具有很快的访问速度,但遍历顺序不确定。
(2) HashMap 中键 key 为 null 的记录至多只允许一条,值 value 为 null 的记录可以有多条。
(3) HashMap 非线程安全,即任一时刻允许多个线程同时写 HashMap,可能会导致数据的不一致。

二、特点

HashMap的特点主要有以下几点:

  1. 线程不安全:HashMap不是线程安全的容器,不适用于多线程环境。如果需要在多线程环境下使用Map,可以考虑使用ConcurrentHashMap或者通过加锁等方式来保证线程安全。
  2. 哈希表实现:HashMap使用哈希表(Hash Table)实现,它通过散列函数将键映射到哈希表的索引位置上,从而实现了快速的插入、删除和查找操作。
  3. 元素无序:HashMap并不保证元素的顺序,元素在哈希表中的位置取决于键的哈希值和哈希表的容量。
  4. 键不重复:HashMap中的键是不允许重复的,如果添加一个键值对时发现键已经存在,则会覆盖原有的值。
  5. 可以存放null:HashMap中的键和值都可以存放null,但是需要注意并发情况下的线程安全性。
  6. 性能高效:由于使用了哈希表实现,HashMap的插入、删除和查找操作的时间复杂度都接近常数级别,因此具有高效的性能。

总之,HashMap是一种常用的数据结构,其主要特点是高效、无序、键不重复,但不具备线程安全性。在使用时需要根据具体应用场景进行选择和设计。

三 使用示例

HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:

import java.util.HashMap; // 引入 HashMap 类

以下实例我们创建一个 HashMap 对象 Sites, 整型(Integer)的 key 和字符串(String)类型的 value:

HashMap<Integer, String> Sites = new HashMap<Integer, String>();

HashMap常用方法:
1、put(K key, V value): 将键(key)/值(value)映射存放到Map集合中。

2、get(Object key): 返回指定键所映射的值,没有该key对应的值则返回 null。

3、size(): 返回Map集合中数据数量。

4、clear(): 清空Map集合。

5、isEmpty(): 判断Map集合中是否有数据,如果没有则返回true,否则返回false。

6、remove(Object key): 删除Map集合中键为key的数据并返回其所对应value值。

7、values(): 返回Map集合中所有value组成的以Collection数据类型格式数据。

8、containsKey(Object key): 判断集合中是否包含指定键,包含返回 true,否则返回false。

9、containsValue(Object value): 判断集合中是否包含指定值,包含返回 true,否则返回false。

10、keySet(): 返回Map集合中所有key组成的Set集合。

11、entrySet(): 将Map集合每个key-value转换为一个Entry对象并返回由所有的Entry对象组成的Set集合。

1 添加元素

1.1 HashMap 类提供了很多有用的方法,添加键值对(key-value)可以使用 put() 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");System.out.println(Sites);}
}

1.2 以下实例创建一个字符串(String)类型的 key 和字符串(String)类型的 value:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<String, String> Sites = new HashMap<String, String>();// 添加键值对Sites.put("one", "hello");Sites.put("two", "world");Sites.put("three", "hi");Sites.put("four", "china");System.out.println(Sites);}
}

2 访问元素

我们可以使用 get(key) 方法来获取 key 对应的 value:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");System.out.println(Sites.get(3));}
}

3 删除元素

3.1 我们可以使用 remove(key) 方法来删除 key 对应的键值对(key-value):

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");Sites.remove(4);System.out.println(Sites);}
}

3.2 删除所有键值对(key-value)可以使用 clear 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");Sites.clear();System.out.println(Sites);}
}

4 计算大小

如果要计算 HashMap 中的元素数量可以使用 size() 方法:

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");System.out.println(Sites.size());}
}

5 迭代 HashMap

可以使用 for-each 来迭代 HashMap 中的元素。

如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。

实例

// 引入 HashMap 类      
import java.util.HashMap;public class worldTest {public static void main(String[] args) {// 创建 HashMap 对象 SitesHashMap<Integer, String> Sites = new HashMap<Integer, String>();// 添加键值对Sites.put(1, "hello");Sites.put(2, "world");Sites.put(3, "hi");Sites.put(4, "china");// 输出 key 和 valuefor (Integer i : Sites.keySet()) {System.out.println("key: " + i + " value: " + Sites.get(i));}// 返回所有 value 值for(String value: Sites.values()) {// 输出每一个valueSystem.out.print(value + ", ");}}
}

6 复制一份 hashMap

方法:clone()

实例

public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("A","1");map.put("B","2");map.put("C","3");Object clone = map.clone();System.out.println("原来的"+map);System.out.println("复制一份"+clone);
}

7 判断 hashMap 是否为空

方法:isEmpty()

实例

public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();HashMap<String, String> map1 = new HashMap<>();map.put("A","1");map.put("B","2");map.put("C","3");boolean empty1 = map.isEmpty();boolean empty2 = map1.isEmpty();System.out.println(empty1);System.out.println(empty2);
}

8 替换 hashMap 中是指定的 key 对应的 value

方法:replace()

实例

public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();HashMap<String, String> map1 = new HashMap<>();map.put("A","1");map.put("B","2");map.put("C","3");System.out.println("替换前----"+map);map.replace("A", "100");System.out.println("替换后----"+map);
}

相关文章:

JavaSE22——HashMap

集合框架_HashMap 一、概述 HashMap 是用于存储 Key-Value 键值对的集合。 &#xff08;1&#xff09;HashMap 根据键的 hashCode 值存储数据&#xff0c;大多数情况下可以直接定位到它的值&#xff0c;所以具有很快的访问速度&#xff0c;但遍历顺序不确定。 &#xff08;2&…...

「图像 merge」无中生有制造数据

在进行一个新项目的时候&#xff0c;往往缺少一些真实数据&#xff0c;导致没办法进行模型训练&#xff0c;这时候就需要算法工程师自行制作一些数据了&#xff0c;比如这篇文章分享的 bag 目标检测&#xff0c;在检测区域没有真实的 bag数据 此时&#xff0c;就可以采用图像拼…...

RK3588之ArmSoM-W3 + MPP实现多路硬解码拉流

简介 学习完MPP的解码Demo之后&#xff0c;想必大家都想通过一个项目来进行RK3588-MPP的解码实战。本篇文章就基于ArmSoM-W3开发板&#xff0c;开发一个多路硬解码项目&#xff0c;实现四路MPP硬解码拉流显示实现的效果如下&#xff1a; RK3588四路MPP硬解码拉流 环境介绍 硬件…...

【Rust日报】2023-10-29 隆重推出 Rerun 0.10!

Lapce代码编辑器发布v0.3.0 Lapce代码编辑器新发布v0.3.0&#xff01; https://lapce.dev/ 距离我们上次发布已经过去很长一段时间了。我们正忙着在自己的 UI 工具包Floem中重写 Lapce &#xff0c;这将使我们以后对 UI 部分代码的开发变得更容易、更快。 另一件值得注意的事情…...

AI智能识别如何助力PDF,轻松实现文档处理?

AI智能识别如何助力PDF&#xff0c;轻松实现文档处理&#xff1f; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;在各个领域都发挥着重要的作用。其中&#xff0c;文档智能&#xff08; Document AI &#xff09;在金融、医疗、教育、保险、能源、物流等…...

【SA8295P 源码分析】114 - 将Android GVM userdata文件系统从 EXT4 修改为 F2FS

【SA8295P 源码分析】114 - 将Android GVM userdata文件系统从 EXT4 修改为 F2FS 一、代码修改方法1. BoardConfig.mk2. 修改 fstab二、开机进入 adb 验证2.1 验证 userdata 修改 f2fs 文件系统格式成功2.2 测试 f2fs 文件系统性能:androbench.apk系列文章汇总见:《【SA8295P…...

LeetCode 387 字符串中的第一个唯一字符 简单

题目 - 点击直达 1. 387 字符串中的第一个唯一字符1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 387 字符串中的第一个唯一字符 1. 题目详情 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返…...

线程池--简单版本和复杂版本

目录 一、引言 二、线程池头文件介绍 三、简单版本线程池 1.创建线程池 2.添加任务到线程池 3.子线程执行回调函数 4.摧毁线程池 5.简单版线程池流程分析 四、复杂版本线程池 1.结构体介绍 2.主线程 3.子线程 4.管理线程 一、引言 多线程版服务器一个客户端就需要…...

docker进阶

文章目录 docker 进阶Part1 常用命令总结docker version 查看docker客户端和服务端信息docker info 查看更加详细信息docker images 列出所有镜像基本用法常用选项 docker search 搜索镜像基本用法示例用法 docker pull 拉取镜像基本用法示例用法 docker rmi 删除镜像基本用法示…...

Unity HoloLens 2 应用程序发布

设置3D 启动器画面&#xff0c;glb格式的模型 VS中可以直接生成所有大小的图标...

3D RPG Course | Core 学习日记三:Navigation智能导航地图烘焙

前言 前面我们已经绘制好了一个简单的地图场景&#xff0c;现在我们需要使用Navigation给地图做智能导航&#xff0c;以实现AI自动寻路&#xff0c;以及设置地图的可行走区域以及不可行走区域&#xff0c;Navigation的基础知识、原理、用法在Unity的官方文档&#xff0c;以及网…...

Linux 启用本地ISO作为软件源

环境&#xff1a;sle12sp5 &#xff08;open SUSE&#xff09; 1、禁用现有的源 查看源&#xff1a;sle12sp5 zypper lr -u ➜ sle12sp5 zypper lr -u Repository priorities are without effect. All enabled repositories share the same prior…...

SpringCloud-Alibaba-Nacos2.0.4

SpringCloud-Alibaba-Nacos2.0.4 SpringCloud Alibaba版本选择&#xff08;截止到2023年3月12日&#xff09; Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version2021.0.4.0*Spring Cloud 2021.0.42.6.11 SpringCloud Alibaba-2021.0.4.0组件版本关系 S…...

docker运行镜像相关配置文件

Dockerfile 文件配置 FROM anapsix/alpine-java:8_server-jre_unlimitedMAINTAINER Lion LiRUN mkdir -p /data/sydatasource/logs \/data/sydatasource/temp \/data/skywalking/agentWORKDIR /data/sydatasourceENV SERVER_PORT8220EXPOSE ${SERVER_PORT}ENV TZAsia/Shanghai …...

引擎系统设计思路 - 用户态与系统态隔离

用户态与系统态隔离&#xff1a; a. 外部用户侧的对象或者逻辑&#xff0c;在外部创建使用。内部系统侧的对象或者逻辑&#xff0c;在内部创建使用。 b. 用户状态下对内部系统的操作要立即响应&#xff0c;但是具体如何实际执行系统内部的机制&#xff0c;则是异步并行的。因为…...

致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]

文章目录 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用…...

​轻量应用服务器有什么优势?如何评价亚马逊云科技轻量应用服务器?

什么是轻量应用服务器&#xff1f; 随着如今各行各业对云计算的需求越来越多&#xff0c;云服务器也被越来越多的企业所广泛采用。其中&#xff0c;轻量应用服务器是一种简单、高效、可靠的云计算服务&#xff0c;能够为开发人员、企业和个人提供轻量级的虚拟专用服务器&#…...

python的日志模块学习记录

logging模块是Python的内置日志模块满足日常需要 使用方法 *** 1.导入*** import logging from logging import config*** 2.配置日志配置项(基本配置一般不能满足需要&#xff0c;一般使用字典配置如下)*** # 日志基本配置方法&#xff0c;一般不能满足需要 logging.basic…...

【java】redisTemplate mock时报空指针

原方法&#xff1a; Boolean locked redisTemplate.opsForValue().setIfAbsent(redisKey, "", 400, TimeUnit.SECONDS);mock方法 mock方法&#xff1a; 需要每个函数都mock。 Mock RedisTemplate redisTemplate;... ValueOperations<String, String> value…...

Hadoop PseudoDistributed Mode 伪分布式

Hadoop PseudoDistributed Mode 伪分布式加粗样式 hadoop101hadoop102hadoop103192.168.171.101192.168.171.102192.168.171.103namenodesecondary namenoderecource managerdatanodedatanodedatanodenodemanagernodemanagernodemanagerjob historyjob logjob logjob log 1. …...

Wan2.2-I2V-A14B高性能推理:C++后端服务开发与优化

Wan2.2-I2V-A14B高性能推理&#xff1a;C后端服务开发与优化 1. 为什么需要C高性能推理服务 在实时图像生成场景中&#xff0c;毫秒级的延迟差异可能直接影响用户体验和业务转化率。传统基于Python的Web框架&#xff08;如Flask/FastAPI&#xff09;虽然开发便捷&#xff0c;…...

MT5文本改写工具5分钟上手:零基础学会用AI一键扩写句子

MT5文本改写工具5分钟上手&#xff1a;零基础学会用AI一键扩写句子 1. 工具简介&#xff1a;你的智能句子改写助手 你是否经常遇到这些情况&#xff1a; 写文章时反复修改同一句话&#xff0c;却总觉得表达不够丰富需要为机器学习模型准备训练数据&#xff0c;但原始文本数量…...

ANIMATEDIFF PRO应用案例:如何制作具有电影感的日落海滩动态壁纸

ANIMATEDIFF PRO应用案例&#xff1a;如何制作具有电影感的日落海滩动态壁纸 1. 为什么选择ANIMATEDIFF PRO制作动态壁纸 1.1 普通视频生成工具的局限 大多数视频生成工具在制作动态壁纸时面临三个主要问题&#xff1a; 动作不连贯&#xff1a;海浪拍打、云层移动等自然现象…...

Android屏幕唤醒技术全解析:从熄屏到亮屏的实现方案

1. Android屏幕唤醒技术概览 你有没有遇到过这样的场景&#xff1a;当手机放在桌上突然来消息时&#xff0c;屏幕会自动亮起显示通知内容&#xff1f;这背后就是Android的屏幕唤醒技术在发挥作用。作为开发者&#xff0c;掌握屏幕唤醒技术不仅能提升用户体验&#xff0c;还能在…...

with open方法详解

Python with open 方法详解 with open 是 Python 中操作文件最推荐、最安全的写法,核心作用是自动管理文件资源,不用手动关闭文件,也能避免文件泄露、数据丢失等问题。 一、基础语法 python 运行 # 标准格式 with open(文件路径, 模式, 编码) as 变量名:# 缩进内写文件操…...

OOMMF实战避坑指南:从编译报错到高级功能解析

1. OOMMF编译安装常见问题解析 第一次接触OOMMF的开发者&#xff0c;90%的时间都花在了环境配置和编译上。作为一个用C和Tcl混合编写的开源软件&#xff0c;OOMMF的编译过程确实存在不少"坑"。最常见的就是双击oommf.tcl后弹出的各种报错窗口——这往往意味着你需要…...

深入理解 sleep() 与 wait():从基础到监视器队列

前言看似都是“让线程停下来”&#xff0c;背后的原理却完全不同在 Java 并发编程中&#xff0c;sleep() 和 wait() 是两个经常被拿来比较的方法。很多初学者甚至有一定经验的开发者&#xff0c;也容易混淆它们。今天这篇文章&#xff0c;我们就从基础区别一路深入到监视器锁的…...

MMC整流器平均值模型simulink仿真,19电平,采用交流电流内环,直流电压外环控制,双二...

MMC整流器平均值模型simulink仿真&#xff0c;19电平&#xff0c;采用交流电流内环&#xff0c;直流电压外环控制&#xff0c;双二阶广义积分器锁相环&#xff0c;PI解耦环流抑制器&#xff0c;调制方式为最近电平逼近调制&#xff0c;完美运行。 波形一二为直流侧电压电流&…...

Linux运维实战:高效文件处理与终端管理技巧

1. 高效处理大文件的技巧1.1 安全删除大文件的方法在生产环境中处理大日志文件时&#xff0c;直接使用rm命令可能会导致系统IO负载过高。我遇到过多次因为删除200GB日志文件导致系统响应缓慢的情况。更安全的做法是&#xff1a;# 首先清空文件内容 > /path/to/file.log # 或…...

嵌入式实时系统AnOs的分时分区架构解析

1. AnOs&#xff1a;嵌入式分时分区实时系统解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;第一次看到AnOs这个项目时眼前一亮。它让我想起了十年前在军工项目中调试VxWorks 653的经历——那种严格的分区保护和实时调度机制&#xff0c;在工业控制、航空航天等高安…...