一篇文章带你彻底理解Java HashMap数据结构详解

基本概念:

​ HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。

HashMap 是无序的,即不会记录插入的顺序。

HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

img

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。

PS:如果需要在多线程环境中使用 HashMap,并保证线程安全,可以使用 java.util.concurrent.ConcurrentHashMap。ConcurrentHashMap 是 Java 提供的一个线程安全的哈希表实现,它可以替代 HashMap 在并发环境中的使用。


HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7axV6X4-1691391012852)(https://static.runoob.com/images/mix/java-map.svg)]

HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

基本类型对应的包装类表如下:

基本类型引用类型
booleanBoolean
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter

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

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

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

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

小结一下HashMap 的基本概念如下:
  1. 键(Key):每个键必须是唯一的。键用于查找和访问与之关联的值。在 HashMap 中,键可以是任意对象,但通常使用不可变(immutable)的对象作为键,例如字符串、数字等。
  2. 值(Value):与每个键关联的值。值可以是任意对象,包括 null。
  3. 哈希表(Hash Table):HashMap 内部使用哈希表数据结构来存储键值对。哈希表通过将键映射为数组索引来实现高效的检索操作。
  4. 哈希码(Hash Code):每个键都有一个对应的哈希码,用于确定键在哈希表中的位置。hashCode() 方法用于计算键的哈希码。
  5. 冲突(Collision):当不同的键具有相同的哈希码时,称为冲突。HashMap 使用链表或红黑树来解决冲突,以确保键值对能正确存储和检索。

HashMap的特点如下:
  • 高效的插入、删除和查找操作:由于使用了哈希表,HashMap 提供了接近常数时间复杂度的性能。
  • 无序的键值对:HashMap 不保证键值对的顺序,因为它是基于哈希表实现的。
  • 允许 null 键和 null 值:HashMap 中可以存储 null 键和 null 值。
  • 非线程安全:HashMap 不是线程安全的,如果多个线程同时访问同一个 HashMap 并进行修改,可能会导致不确定的结果。如果需要在多线程环境中使用,可以考虑使用 ConcurrentHashMap。

下面是具体的例子:

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> fruitQuantityMap = new HashMap<>();

        // 添加键值对
        fruitQuantityMap.put("Apple", 10);
        fruitQuantityMap.put("Banana", 5);
        fruitQuantityMap.put("Orange", 8);

        System.out.println("HashMap 初始内容: " + fruitQuantityMap);

        // 修改键为 "Banana" 的值为 6
        fruitQuantityMap.put("Banana", 6);
        System.out.println("修改后的 HashMap: " + fruitQuantityMap);

        // 删除键为 "Orange" 的键值对
        fruitQuantityMap.remove("Orange");
        System.out.println("删除键为 \"Orange\" 后的 HashMap: " + fruitQuantityMap);

        // 获取键为 "Apple" 的值
        int appleValue = fruitQuantityMap.get("Apple");
        System.out.println("键为 \"Apple\" 的值为: " + appleValue);

        // 遍历 HashMap
        System.out.println("遍历 HashMap:");
        for (Map.Entry<String, Integer> entry : fruitQuantityMap.entrySet()) {
            String fruit = entry.getKey();
            int quantity = entry.getValue();
            System.out.println(fruit + ": " + quantity);
        }
    }
}

输出结果如下:

Copy CodeHashMap 初始内容: {Apple=10, Orange=8, Banana=5}
修改后的 HashMap: {Apple=10, Orange=8, Banana=6}
删除键为 "Orange" 后的 HashMap: {Apple=10, Banana=6}
键为 "Apple" 的值为: 10
遍历 HashMap:
Apple: 10
Banana: 6

运行程序后,会输出初始的 fruitQuantityMap 的内容,然后按顺序进行修改、删除和获取操作,并显示相应的结果。最后,通过遍历 fruitQuantityMap,打印出所有水果及其对应的数量。


HashMap常用的方法有:

常用方法列表如下:

方法描述
clear()删除 hashMap 中的所有键/值对
clone()复制一份 hashMap
isEmpty()判断 hashMap 是否为空
size()计算 hashMap 中键/值对的数量
put()将键/值对添加到 hashMap 中
putAll()将所有键/值对添加到 hashMap 中
putIfAbsent()如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。
remove()删除 hashMap 中指定键 key 的映射关系
containsKey()检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue()检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace()替换 hashMap 中是指定的 key 对应的 value。
replaceAll()将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get()获取指定 key 对应对 value
getOrDefault()获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach()对 hashMap 中的每个映射执行指定的操作。
entrySet()返回 hashMap 中所有映射项的集合集合视图。
keySet()返回 hashMap 中所有 key 组成的集合视图。
values()返回 hashMap 中存在的所有 value 值。
merge()添加键值对到 hashMap 中
compute()对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent()对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent()对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

更多 API 方法可以查看:https://www.runoob.com/manual/jdk11api/java.base/java/util/HashMap.html

结尾语:记录于2023年8月7号14时48分,以上仅为个人在[Java数据结构HashMap—Java高级编程—菜鸟教程](Java HashMap | 菜鸟教程 (runoob.com))的学习过程中遇到的问题,还有记录的个人想法,有错误欢迎指出,希望对您有帮助,感谢观看!如果可以的话,点点赞,点点关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Stevedash

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

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

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

打赏作者

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

抵扣说明:

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

余额充值