Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

为什么 String、Integer 常适合作为 HashMap 的键?

查看完整题解

参考回答

直接回答

它们不可变,并提供一致的 equals 与 hashCode,实现值相等且哈希稳定,能减少入表后键状态变化导致的查找问题。String 是文本类,Integer 才是基本类型的包装类,原题把两者统称为“包装类”,这里需要纠正。适合作为键也不意味着哈希绝不碰撞,或业务上总应使用它们。

讲清原理

HashMap 入表时根据键的哈希确定位置,之后查询仍按哈希定位。若键的判等字段改变,旧记录不会自动迁移,可能出现“明明放进去了却查不到”。不可变值类型把这种风险降下来,但仍需要业务编号、大小写与标准化规则一致。

自定义不可变键同样可以合适,只要完整实现相等性与哈希约定。含可变成员的 record 也可能出问题;final 字段只能固定引用,不能保证所引用对象不可变。

例子与易错点

Java 21 的 main 片段:

var users = new java.util.HashMap<String, Integer>();
users.put(new String("user-7"), 7);
System.out.println(users.get(new String("user-7")));
var counts = new java.util.HashMap<Integer, String>();
counts.put(1000, "ok");
System.out.println(counts.get(Integer.valueOf(1000)));

输出 7、ok。查询依赖值判等,而非字符串驻留或 Integer 缓存;用 == 猜测键能否找到,会把对象引用与业务相等混淆。

相关题:第 30 题、第 40 题、第 42 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。