Java中存入键值对需注意:声明用泛型接口(如Map<String, Integer>),自定义key须重写hashCode和equals,null键值易致歧义,建议避免或配合containsKey/Optional使用。

Java 中存入键值对,核心就是 put(key, value) 方法,但要真正用得稳、不出错,得注意几个关键点。
声明时明确泛型类型
别写 HashMap map = new HashMap() 这种裸类型。类型擦除会导致运行时强转出 ClassCastException,尤其在取值后做转型时很难排查。
正确写法是用接口声明 + 显式泛型:
Map<string integer> scoreMap = new HashMap();</string>Map<long user> userMap = new HashMap();</long>
这样编译器能检查类型,IDE 也能提供准确提示,后续换成 ConcurrentHashMap 也只需改构造部分,不碰声明。
立即学习“Java免费学习笔记(深入)”;
调用 put() 存入数据
put() 是主要入口,它会自动处理以下逻辑:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 若 key 为
null,固定存入数组索引 0 的位置(只允许一个null键) - 若 key 非
null,先计算扰动哈希值,再用(n - 1) & hash算出桶下标(n是数组长度,必须是 2 的幂) - 桶为空:直接新建节点插入
- 桶非空:先用
==或equals()比较 key,相同则覆盖 value;不同则链表尾插或红黑树插入
示例:
scoreMap.put("math", 95);scoreMap.put("english", 87);
scoreMap.put(null, 0); // 合法,但慎用
自定义类作 key 必须重写 hashCode 和 equals
如果 key 是自己写的类(比如 Student),不重写这两个方法,put() 和 get() 就可能失效——因为默认的 hashCode() 基于内存地址,两个内容相同的对象哈希值不同,会被当成不同 key 存进不同桶。
要求:
-
equals()返回true的两个对象,hashCode()必须返回相同整数 - 只要参与
equals()判断的字段,就必须参与hashCode()计算 - 存入后不要修改影响
hashCode()的字段,否则get()找不到原位置
注意 null 键/值带来的歧义
put(null, "unknown") 合法,get(null) 也能取到值。但问题在于:get(key) 返回 null 时,你无法区分这是“键不存在”,还是“该键对应值就是 null”。
解决办法:
- 业务上尽量避免存
null值 - 必须支持时,用
containsKey(key)先确认键是否存在 - 更严谨场景可用
Optional<v></v>包装返回值,把“无值”和“值为 null”区分开

















