Java HashMap用法详解

文章目录

  • 一、定义
  • 二、核心方法
  • 三、实例演示
    • 3.1、方法示例
    • 3.2、get()方法注意点!

一、定义

Java 的 HashMap 是 Java 集合框架中的一个非常重要的类,它实现了 Map 接口。HashMap基于哈希表的数据结构,允许使用键-值对存储数据。这种存储方式使得HashMap 提供了非常快速的插入、查找和删除操作,平均时间复杂度为O(1)。以下是 HashMap 的一些关键特性:

  • 键的唯一性:HashMap 中的键必须是唯一的,不允许有重复的键,但值可以重复。

  • 无序性:HashMap 不保证映射的顺序,特别是它不保证顺序会随时间保持不变。

  • 允许 null 值和 null 键:HashMap 允许一个 null 键和多个 null 值。但是,null 键只能有一个。

  • 非同步:HashMap 是非同步的,如果多个线程同时访问一个 HashMap 实例,并且至少有一个线程从结构上修改了该映射,那么它必须保持外部同步。

  • 性能:由于基于哈希表,HashMap 提供了非常高效的查找、插入和删除操作。

二、核心方法

Java HashMap 常用方法列表如下:

方法描述
put(K key, V value)将指定的键-值对放入映射中。如果该映射以前包含该键的映射关系,则替换其旧值。
get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
remove(Object key)如果存在该键的映射关系,则将其从映射中移除。
containsKey(Object key)如果此映射包含指定键的映射关系,则返回 true。
containsValue(Object value)如果此映射将一个或多个键映射到指定值,则返回 true。
size()返回此映射中的键-值对数量。
isEmpty()如果此映射不包含键-值对映射关系,则返回 true。
keySet()返回此映射中包含的键的 Set 视图。
values()返回此映射中包含的值的 Collection 视图。
entrySet()返回此映射中包含的键-值映射关系的 Set 视图。

三、实例演示

3.1、方法示例

下面写的Java程序使用了常用的HashMap方法。

package com.example.demo;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");// 访问元素System.out.println(map.get("EQUIP_ID"));// 是否包含键System.out.println(map.containsKey("BEGIN_TIME"));// 是否包含值System.out.println(map.containsValue("123456"));// 键值对的数量System.out.println(map.size());// HashMap是否为空System.out.println(map.isEmpty());// 获取所有键的Set集合Set<String> keySets = map.keySet();System.out.println(keySets);// 获取所有值的Collection集合Collection<String> valueSets = map.values();System.out.println(valueSets);// 返回所有的键值对Set集合Set<Map.Entry<String, String>> keyvalueSets = map.entrySet();System.out.println(keyvalueSets);// 移除键值对map.remove("EQUIP_ID");System.out.println(map.size());}
}

控制台的输出也非常的合理,这也比较通俗易懂。

123456
true
true
3
false
[END_TIME, BEGIN_TIME, EQUIP_ID]
[2024-11-25 18:12, 2024-11-22 13:52, 123456]
[END_TIME=2024-11-25 18:12, BEGIN_TIME=2024-11-22 13:52, EQUIP_ID=123456]
2Process finished with exit code 0

3.2、get()方法注意点!

1、看到get方法的详解:返回指定键映射到的值,如果此映射不包含键的映射,则返回null。但返回null不代表不存在该键,也有可能是这个键的值就为null。

在这里插入图片描述

2、打个比方:我取出map中不存在的键,返回的就是null,空对象。

public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");System.out.println(map.get("RMC_TIME"));System.out.println(map.remove("EQUIP_ID"));}}

3、或者,我直接在插入键值对的时候,值就为null,那么取出来也是null

public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");map.put("POS_CODE", null);System.out.println(map.get("RMC_TIME"));System.out.println(map.get("POS_CODE"));}
}

4、那如果我取出不存在key的value,然后插入到一个新的key中,再取出的value是null还是空字符串呢?答案是为null。因为get得到的值为null,然后插入的键值对就是(VALUE, null)

public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("VALUE", map.get("VALUE"));System.out.println(map.get("VALUE"));}
}

5、在大数据处理过程中,和键值对列表打交道是最多的,为了避免取出的值为null或者为"",我们需要进行判断:

public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");map.put("POS_CODE", "");map.put("VALUE", "");if (map.get("VALUE") != null && !map.get("VALUE").isEmpty()) {System.out.println(map.get("VALUE"));}}
}

认识越多的人,越觉得思维方式真的很不一样,多取长补短,多反思总结,执行力是核心竞争力。

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

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

相关文章

淘宝直播间智能化升级:基于LLM的学习与分析

自营直播应用技术团队负责的业务中&#xff0c;淘宝买菜的直播业务起步较晚&#xff0c;业务发展压力较大&#xff0c;业务上也就有了期望能够对一些二方的标杆直播间进行学习&#xff0c;并将其优点应用到自己直播间的需求。 最初 - 人海战术&#xff0c;学习PK 业务侧最直接的…

有的开发者用Apache-2.0开源协议,但是不允许商用?合理吗

Apache 2.0开源协议是设计用来允许商业使用的。该协议明确授予了使用者在遵守许可条款的情况下&#xff0c;对软件进行复制、修改、分发以及商业使用的权利。这包括但不限于&#xff1a; 1. 永久、全球性的版权许可&#xff1a;允许复制、准备衍生作品、公开展示、公开演出、从…

java学习 -----项目(1)

项目 写在前面的话&#xff1a;耳机没电&#xff0c;先来写写今早的感受。说实话&#xff0c;我并不喜欢我们的职业规划老师&#xff0c;满嘴荒唐言&#xff0c;被社会那所大缸浸染了一身社会气。课快结束时&#xff0c;老师问还有谁的视频没做&#xff0c;我把手举了起来。&a…

某j vue3 ts 随笔

因为ts组件封装的缘故&#xff0c;使用某个组件就必须按照这个组件的规则使用&#xff0c;老是忘记&#xff0c;这里就记一下吧 1.ApiSelect 组件 {label: 角色,field: selectedroles,component: ApiSelect,componentProps: {mode: multiple,api: getAllRolesListNoByTenant,la…

红旗Asianux8.1+高斯GaussDB6.0安装手册

一、简介 服务器系统&#xff1a;红旗Asianux8.1&#xff08;需联网&#xff09;高斯GaussDB6.0&#xff1a;openGauss_6.0.0 极简版 二、安装准备 关闭防火墙 systemctl stop firewalld systemctl disable firewalld###查看状态 systemctl status firewalld 上传安装包 创建组…

如何实现Docker容器自动更新?从此无需再手动更新!(如何实现docker容器的自动更新、docker容器如何实现定时更新)

以下是经过优化后的完整文章内容: 文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Docker 容器自动更新的需求 📒📝 解决方案概述📝 Docker 容器自动更新📝 Docker 容器定期更新📝 实现指定容器更新或排除更新⚓️ 相关链接 ⚓️📖 介绍 📖 随着容器化技术的普…

python异常、模块和包

文章目录 异常异常简介异常处理捕获所有异常捕获指定异常捕获多个指定异常 异常else、finally异常的传递 模块模块导入自定义模块 包自定义python包安装第三方python包 综合案例 异常 异常简介 异常就是程序运行过程中出现了错误 f open(RLlearn_2.txt, "r", enc…

Python内存泄漏 —— 宏观篇

Python内存泄漏 —— 宏观篇 应该弄清楚哪些问题 内存情况如何&#xff0c;是否一直增长&#xff1f;哪些是异常对象&#xff1f;这类对象占总内存多大比例&#xff1f;异常对象为何泄漏&#xff1f;如何使其正常释放&#xff1f;如何确定异常对象正常释放了&#xff1f;如何…

Chromium CDP 开发(五):注册自己的指令(中)

引言 在前一篇文章中&#xff0c;我们已经了解了 PDL&#xff08;Protocol Description Language&#xff09;的基本功能以及如何在其中声明 CDP&#xff08;Chrome DevTools Protocol&#xff09;指令和事件的具体内容。接下来&#xff0c;我们将深入探讨如何在实际开发中进行…

回溯算法解决全排列问题

1. 问题描述 定义&#xff1a;给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列 。 示例&#xff1a; 输入数组 [1, 2, 3] 输出结果应该为&#xff1a; leetcode 地址 2. 代码实现 package com.ztq.algorithm.BackTrack;import java.util.List; impo…

金融行业 IT 实践|某信托公司:从虚拟化到容器平台的 VMware 替代与双活建设实践

随着“VMware 替代” 在金融行业的快速推进&#xff0c;不少金融用户的替代进程已逐渐从存储、虚拟化过渡到容器平台层面&#xff0c;实现更为全面的 VMware 国产化替代与架构升级。其中&#xff0c;某信托用户在使用 SmartX 超融合&#xff08;采用 VMware 虚拟化和 Tanzu 容器…

python学习——格式化字符串

在Python中&#xff0c;格式化字符串是一种将变量插入到字符串中的方法&#xff0c;使得字符串的构建更为灵活和方便。以下是一些常见的格式化字符串的方法&#xff1a; 文章目录 1. 使用百分号 % 格式化2. 使用 str.format() 方法3. 使用 f-string (格式化字符串字面量)格式说…

【上线文档】系统上线方案模板,计算机系统上线保障计划,系统运维信息系统运行保障方案,系统上线方案模板(Word原件)

一、项目背景和目标 二、项目需求分析 2.1 功能需求 2.2 非功能需求 三、系统设计 3.1 系统架构设计 3.2 数据库设计 3.3 接口设计 3.4 用户界面设计 四、系统开发 4.1 开发环境搭建 4.2 业务逻辑开发 4.3 数据库实现 4.4 接口实现 4.5 用户界面实现 五、系统测…

MySQL索引再认识

在最近的一次MySQL测试过程中&#xff0c;我的同事幺加明遇到了一些令人困惑的现象&#xff0c;这些现象超出了我们最初的预期。一直以来&#xff0c;我们在建立索引时&#xff0c;首要考虑的原则是在区分度大的字段上建立索引。然而&#xff0c;在实际测试中&#xff0c;我们发…

SQL靶场第一关

打开sql靶场 一.判断注入类型 在网址输入?id1&#xff0c;页面正常回显 我们在输入?id1,页面报错&#xff0c;说明存在sql注入 我们再输入?id1 and 11--&#xff0c;页面正常回显 我们在输入?id1 and 12--&#xff0c;页面没有回显 这里我们知道了是字符型注入 为什么是…

ollama运行qwen2.5-coder:7b

1.linux安装 curl -fsSL https://ollama.com/install.sh | sh ollama serve # 启动ollama ollama create # 从模型文件创建模型 ollama show # 显示模型信息 ollama run # 运行模型&#xff0c;会先自动下载模型 ollama pull # 从注册仓库中拉取模…

牛客——打印日期,日期累加(C++)

目录 1.日期累加 1.1题目描述 1.2思路 1.3 2.打印日期 2.1题目描述 2.2思路 2.3代码 1.日期累加 1.1题目描述 计算一个日期加上若干天后是什么日期。输入第一行表示样例个数m&#xff0c;接下来m行每行四个整数分别表示年月日和累加的天数。输出m行&#xff0c;每行按…

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者&#xff0c;我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单&#xff1a;将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展&#xff0c;但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…

AD20 原理图库和PCB库添加

一 点击右下角 二 点击Components 三 点击File-based Libraries Preferences 四 最后点击安装即可

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…