网站首页 > 技术文章 正文
哈喽 大家好!
我是老陈,这节课一起学习HashMap,HashMap就像 “带索引的电子词典”—— 每个词条(键值对)通过唯一索引(键)快速查找,是 Java 中最常用的键值存储结构!
35.1 HashMap 的核心特性:哈希存储与键值对映射
HashMap 是 “会自动归类的电子抽屉”,每个抽屉(键)对应唯一物品(值),放入和取出时通过抽屉标签快速定位。它内部基于哈希表实现,通过键的哈希值计算存储位置,就算数据量很大,也能在极短且稳定的时间内完成读写操作。
put (K key, V value):向 HashMap 中添加键值对。键必须是唯一的,而值可以重复。
get(Object key):通过键来获取对应的值。如果键不存在,则返回 null。
remove(Object key):移除指定键的映射,并返回被删除的值。如果键不存在,则返回 null。
package com.map.demo;
import java.util.Map;
import java.util.HashMap;
/**
* @author 今日头条:老陈说编程
* HashMap的基本特性及键值操作演示
* 本类展示了HashMap的核心特性,包括:
* 1. 允许null键和null值
* 2. 键唯一性与值覆盖
* 3. 无序性(不保证插入顺序)
* 4. 基本的增删查操作
*/
public class HashMapBasicFeatures {
public static void main(String[] args) {
// 1. 创建HashMap实例
// 使用默认初始容量16和负载因子0.75
// 当元素数量超过容量*负载因子时会自动扩容
Map<String, String> dictionary = new HashMap<>();
// 2. 添加键值对
// 键必须唯一,值可以重复
// 内部通过键的hashCode()和equals()保证唯一性
dictionary.put("java", "面向对象编程语言");
dictionary.put("algorithm", "数据处理逻辑");
// HashMap允许一个键为null,且可以存储在任何位置
// null键的hashCode被特殊处理为0
dictionary.put(null, null);
// 输出结果不保证顺序,依赖内部哈希表实现
System.out.println("初始集合:" + dictionary);
// 3. 重复键覆盖机制
// 对已存在的键调用put()会替换原值
// 返回值为被替换的旧值(此处为"面向对象编程语言")
dictionary.put("java", "Java 21新特性");
System.out.println("覆盖后:" + dictionary);
// 4. 查找操作
// 通过键获取值
// 若键不存在返回null
System.out.println("查找java:" + dictionary.get("java"));
// 5. 删除操作
// 移除指定键的映射,返回被删除的值
// 若键不存在返回null
dictionary.remove("algorithm");
System.out.println("删除后:" + dictionary);
}
}
35.2 核心操作:HashMap 的增删改查
操作 HashMap 就像 “管理带标签的抽屉”—— 用 put 放物品,get 按标签取,remove 撕标签,清晰高效!
put (K key, V value) 方法用于向 HashMap 中添加键值对。如果键已存在,会覆盖原有值并返回旧值;如果键不存在,则返回 null。
containsKey (Object key) 方法用于检查 HashMap 中是否存在指定的键。
get(Object key) 方法用于获取指定键对应的值。如果键存在,返回对应的值;如果键不存在,返回 null。
package com.map.demo;
import java.util.Map;
import java.util.HashMap;
/**
* @author 今日头条:老陈说编程
* HashMap的增删改查及遍历方式演示
* 本类展示了HashMap的基本操作,包括创建、添加元素、更新元素、查询元素以及三种不同的遍历方式
*/
public class HashMapOperations {
public static void main(String[] args) {
// 1. 创建HashMap存储学生成绩
// 使用String类型作为键(学生姓名),Integer类型作为值(成绩)
Map<String, Integer> scores = new HashMap<>();
// 添加元素到HashMap中
// 使用put方法添加键值对,如果键已存在则覆盖原有值
scores.put("张三", 90);
scores.put("李四", 85);
scores.put("王五", 95);
// 2. 操作演示
// 检查HashMap中是否存在指定的键
System.out.println("是否存在张三:" + scores.containsKey("张三")); // 输出:true
// 根据键获取对应的值
System.out.println("王五的成绩:" + scores.get("王五")); // 输出:95
// 更新已有键对应的值
scores.put("李四", 90); // 将李四的成绩从85更新为90
System.out.println("更新后李四的成绩:" + scores.get("李四"));
// 3. 遍历键值对(三种方式)
// 方式1:使用entrySet()遍历
// entrySet()返回一个包含Map.Entry对象的Set集合
// 每个Map.Entry对象包含一个键值对,通过getKey()和getValue()方法获取
System.out.println("\n遍历方式1:entrySet()");
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
// 方式2:使用keySet() + get()遍历
// keySet()返回所有键的Set集合,通过遍历键集合再获取对应的值
// 这种方式效率稍低,因为每次get()操作需要进行哈希查找
System.out.println("\n遍历方式2:keySet() + get()");
for (String name : scores.keySet()) {
System.out.println(name + ":" + scores.get(name));
}
// 方式3:使用values()遍历
// values()返回所有值的Collection集合,只能获取值,无法获取键
System.out.println("\n遍历方式3:values()");
for (Integer score : scores.values()) {
System.out.println("成绩:" + score);
}
}
}
总结HashMap 的适用场景
快速键值查找:如字典、配置表、缓存等,需要通过键快速获取值的场景。
无顺序要求的数据存储:当不需要按插入顺序或排序遍历,只关注键值映射时。
单线程环境下的高性能需求:相比其他 Map 实现,HashMap 在单线程下读写效率最高。
下期将讲解 TreeMap,记得点赞关注,评论区留下你对 HashMap 的疑问,我们一起解决!
猜你喜欢
- 2025-07-20 Hutool JSONUtil巧妙过滤null值:JSON转Map数据清洗的终极方案
- 2025-07-20 HBase基础知识,面向列的实时分布式数据库
- 2025-07-20 Java Map 所有的值转为String类型
- 2025-07-20 HashMap-entrySet( )原理(hashmap原理详解)
- 2025-07-20 常见的Java性能问题,我来手把手教你定位!
- 2025-07-20 面试怕被问Hashmap,多看看这个文章
- 2025-07-20 Map遍历的四种方法效率对比(map遍历方式)
- 2025-07-20 面试官:知道ThreadLocal嘛?谈谈你对它的理解?
- 2025-07-20 内存溢出OutOfMemoryError科普系列一
- 2025-07-20 HashMap详解(hashmap理解)
- 最近发表
-
- Qt编程进阶(63):Qt Quick高级控件的使用
- Qt编程进阶(47):QML鼠标事件处理(qt编程难不难)
- 使用Xamarin和Visual Studio开发Android可穿戴设备应用
- Qt使用教程:创建Qt Quick应用程序(三)
- QML性能优化 | 常见界面元素优化(qml布局自适应大小)
- Qt使用教程:创建移动应用程序(二)
- Qt Quick 多媒体开发播放音乐和视频
- Qt使用教程:创建Qt Quick UI表单(三)
- 如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?
- QML控件:TextInput, TextField, TextEdit, TextArea用法及自定义
- 标签列表
-
- axure 注册码 (25)
- exploit db (21)
- mutex_lock (30)
- oracleclient (27)
- nfs (25)
- springbatch (28)
- oracle数据库备份 (25)
- dir (26)
- connectionstring属性尚未初始化 (23)
- output (32)
- panel滚动条 (28)
- centos 5 4 (23)
- sql学习 (33)
- c 数组 (33)
- pascal语言教程 (23)
- ppt 教程 (35)
- java7 (24)
- 自适应网站制作 (32)
- server服务自动停止 (25)
- 超链接去掉下划线 (34)
- 什么是堆栈 (22)
- map entry (25)
- ubuntu装qq (25)
- outputstreamwriter (26)
- fill_parent (22)