前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入剖析HashMap:理解Hash、底层实现与扩容机制

深入剖析HashMap:理解Hash、底层实现与扩容机制

作者头像
人不走空
发布2024-02-20 20:28:52
5500
发布2024-02-20 20:28:52
举报
文章被收录于专栏:学习与分享学习与分享

一、简单叙述

HashMap是Java中常用的一种数据结构,它以键值对的形式存储数据,具有高效的查找、插入和删除操作。本文将详细介绍HashMap的底层实现原理,包括哈希技术、底层数据结构和扩容机制,帮助读者深入理解HashMap的工作原理。

HashMap是Java集合框架中的一部分,它基于哈希表实现,允许使用任何对象作为键来存储和检索值。HashMap是非同步的,如果多个线程同时访问并至少有一个线程修改了HashMap,则必须在外部同步。

底层实现

代码语言:javascript
复制
public class HashMap<K, V> {
    static class Node<K, V> {
        final int hash;
        final K key;
        V value;
        Node<K, V> next;

        Node(int hash, K key, V value, Node<K, V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
    }

    // 其他代码...
}

二、哈希技术

  1. 哈希函数

哈希函数是一种将任意长度的数据映射为固定长度数据的算法。在HashMap中,哈希函数的作用是将键映射到一个索引位置,以便快速查找和存储键值对。

  1. 哈希冲突

当两个或多个键的哈希值相同时,它们将映射到同一个索引位置,这种现象称为哈希冲突。HashMap使用链表和红黑树来解决哈希冲突,确保每个索引位置只存储一个键值对。

三、HashMap的底层实现

  1. 数据结构

HashMap底层采用数组+链表+红黑树的数据结构实现。数组是HashMap的主体,用于存储键值对;链表用于解决哈希冲突;红黑树是在链表长度超过一定阈值(默认为8)时,将链表转换为红黑树,以提高查找效率。

  1. 存储结构

HashMap的存储结构是一个Node类型的数组,Node是一个内部类,实现了Map.Entry接口。每个Node对象包含四个属性:key(键)、value(值)、hash(哈希值)和next(指向下一个Node的指针)。当发生哈希冲突时,新的键值对将被添加到链表中。

四、扩容机制

  1. 什么时候扩容

当HashMap中的元素数量达到数组大小的加载因子(默认为0.75)时,会触发扩容操作。加载因子是一个阈值,用于控制数组的大小和扩容的时机。加载因子越大,数组的空间利用率越高,但冲突的概率也越大;加载因子越小,数组的空间利用率越低,但冲突的概率也越小。因此,选择合适的加载因子可以平衡空间利用率和冲突概率。

  1. 如何扩容

扩容操作包括两个步骤:创建新的数组和重新计算键的哈希值。首先,HashMap会创建一个新的数组,其大小是原数组大小的两倍。然后,HashMap会遍历原数组中的每个元素,重新计算键的哈希值,并将键值对存储到新的数组中。在重新计算哈希值时,HashMap会使用一个特殊的算法来确保相同的键在新的数组中仍然具有相同的哈希值。这个算法称为“再哈希”。

代码语言:javascript
复制
void resize(int newCapacity) {
    Node<K, V>[] oldTable = table;
    int oldCapacity = oldTable.length;
    
    if (oldCapacity == MAXIMUM_CAPACITY) {
        threshold = Integer.MAX_VALUE;
        return;
    }

    Node<K, V>[] newTable = new Node[newCapacity];
    transfer(newTable);
    table = newTable;
    threshold = (int) (newCapacity * loadFactor);
}

五、总结

本文详细介绍了HashMap的底层实现原理,包括哈希技术、底层数据结构和扩容机制。HashMap是一种高效的数据结构,它使用哈希表实现键值对的存储和检索操作。通过深入了解HashMap的工作原理,我们可以更好地理解和使用它来解决实际问题。在实际开发中,我们需要根据具体情况选择合适的加载因子和初始容量来创建HashMap实例以提高性能和效率。

参考文章

谈谈我对HashMap扩容机制的理解及底层实现-CSDN博客

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简单叙述
    • 底层实现
    • 二、哈希技术
    • 三、HashMap的底层实现
    • 四、扩容机制
    • 五、总结
    • 参考文章
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com