Java HashMap用法详解

一、定义

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]
2

Process 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"));
        }

    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

振华OPPO

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值