第7题:HashMap的get流程是什么
📚 回答:
-
步骤1:判断集合是否为空
调用
HashMap的get方法时,首先会根据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; } - 情况1:目标位置为空
💡 面试官视角:
- 面试官可能会问"为什么链表和红黑树的查找逻辑不同?"
答:因为红黑树的时间复杂度为O(log n),比链表的**O(n)**更高效,所以在冲突较多时使用红黑树能显著提升性能。 - 面试官可能会追问"如果找不到目标元素会返回什么?"
答:如果没有找到对应的key,最终会返回null。