为什么 String、Integer 常适合作为 HashMap 的键?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
它们不可变,并提供一致的 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 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。