【大白话说Java面试题】【Java基础篇】第7题:HashMap的get流程是什么

第7题:HashMap的get流程是什么

📚 回答:

  • 步骤1:判断集合是否为空

    调用HashMapget方法时,首先会根据key计算哈希值。如果集合为空(即数组尚未初始化),直接返回null

  • 步骤2:计算位置下标

    如果集合不为空,将key的哈希值与数组长度减1(length - 1)进行按位与运算,得到目标元素的位置下标。

  • 步骤3:查找目标元素

    • 情况1:目标位置为空
      如果该位置没有元素,直接返回null
    • 情况2:目标位置有元素
      判断该位置元素的hash值和key是否与要查找的元素一致。如果一致,说明找到了目标元素,直接返回。
      • 如果不一致,则继续向下查找:
        • 如果下一个节点为空,直接返回null
        • 如果下一个节点不为空:
          • 如果是红黑树节点(TreeNode),走红黑树的查找逻辑。
          • 如果是普通链表节点,走链表遍历逻辑,逐一比较每个节点的hash值和key,直到找到目标元素或遍历结束。
    java 复制代码
    // 源码位置:java.util.HashMap#getNode
    /**
     * Implements Map.get and related methods.
     *
     * @param hash hash for key
     * @param key the key
     * @return the node, or null if none
     */
    final Node<K,V> getNode(int hash, Object key) {
        Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
        if ((tab = table) != null && (n = tab.length) > 0 &&
            (first = tab[(n - 1) & hash]) != null) {
            if (first.hash == hash && // always check first node
                ((k = first.key) == key || (key != null && key.equals(k))))
                return first;
            if ((e = first.next) != null) {
                if (first instanceof TreeNode)
                    return ((TreeNode<K,V>)first).getTreeNode(hash, key);
                do {
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        return e;
                } while ((e = e.next) != null);
            }
        }
        return null;
    }

💡 面试官视角

  • 面试官可能会问"为什么链表和红黑树的查找逻辑不同?"
    答:因为红黑树的时间复杂度为O(log n),比链表的**O(n)**更高效,所以在冲突较多时使用红黑树能显著提升性能。
  • 面试官可能会追问"如果找不到目标元素会返回什么?"
    答:如果没有找到对应的key,最终会返回null
相关推荐
Tigshop开源商城14 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
养肥胖虎14 小时前
Docker学习笔记:后端、数据库和反向代理怎么一起跑起来
后端·nginx·docker·postgresql·go·部署
REDcker14 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
晓杰'15 小时前
从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
后端·websocket·typescript·node.js·游戏开发·项目实战·nestjs
无所事事O_o15 小时前
二次验证码TOTP 使用说明
后端·二次验证码·谷歌验证器
ltl15 小时前
Multi-Head Attention:为什么要分多个头
后端
kobesdu16 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx2316 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy16 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
江离w16 小时前
新版vibecoding项目初始化指令
java