HashMap 的工作原理是什么?
查看完整题解
参考回答
直接回答
HashMap 把键值对放进桶数组。写入或查询时,先根据键的哈希值定位桶,再在桶内比较键;键已经存在就替换值,否则新增映射。OpenJDK 21 的桶可以是链表或树,元素增多时可能扩容。它允许 null 键和值,不保证遍历顺序,也不保证线程安全。
讲清原理
可以把桶看成先按号码分区的抽屉。号码只帮助缩小范围,同一个抽屉仍可能有不同的键,所以最终还要判等。实现会混合 hashCode 的高低位,用数组长度减一作掩码得到下标;null 键按哈希零处理。
通常在哈希分布良好时,get、put 的基本成本接近常数。碰撞、扩容、键比较成本都会影响实际耗时,不能承诺每次操作都严格 O(1)。树化也有桶长度和数组容量等前提,不是“碰到重复哈希就变树”。
例子与易错点
下面 Java 21 片段放入 main:
var prices = new java.util.HashMap<String, Integer>();
prices.put("tea", 8);
System.out.println(prices.put(new String("tea"), 10));
System.out.println(prices.size() + ":" + prices.get("tea"));
输出先是 8,再是 1:10。两个键对象不是同一个引用,但 equals 相等,因而更新同一条映射。键参与判等和哈希的状态在入表后应保持稳定。
相关题:第 13 题、第 41 题、第 42 题、第 44 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。