海量编程文章、技术教程与实战案例

网站首页 > 技术文章 正文

35. HashMap 拆解,键值对存储探究

yimeika 2025-07-20 06:41:36 技术文章 3 ℃

哈喽 大家好!

我是老陈,这节课一起学习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 的疑问,我们一起解决!



#java##程序员##计算机##软件开发##人工智能##ai##热搜##热门#

Tags:

最近发表
标签列表