掌握hashmap核心在于理解键值存储、取值逻辑、哈希冲突处理与扩容机制;需预设容量避免频繁扩容,null键唯一但null值允许多个,put覆盖旧值,putifabsent防误覆盖,遍历时优先entryset,自定义key必须重写hashcode和equals。

掌握 Java HashMap 的核心用法,关键不在背方法名,而在理解“键怎么存、值怎么取、冲突怎么处理、扩容什么时候发生”这四件事。下面从实战角度拆解最常碰的几个环节。
创建与初始化要留心容量和 null
日常写 new HashMap() 没问题,但高频写入场景建议预设初始容量:
- 默认容量是 16,负载因子 0.75 → 超过 12 个元素就触发扩容,影响性能
- 如果预估要存 100 个键值对,可写
new HashMap(128)(取大于 100/0.75 的最小 2 的幂) - null 键只允许一个,重复 put 会覆盖;null 值可多个,但
get()返回 null 时无法区分“没找到”还是“存的就是 null”,建议配合containsKey()判断
增删改查不能只记 API,得懂行为逻辑
这些操作看似简单,但细节决定是否出 bug:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
put(key, value):键存在则覆盖旧值,返回旧值;键不存在则新增,返回 null -
putIfAbsent(key, value):仅当 key 不存在时才插入,避免误覆盖 -
remove(key)返回被删的 value;remove(key, value)是“精准删除”,只有键值完全匹配才成功 -
getOrDefault(key, defaultValue)是安全取值首选,比如统计字符频次:map.put(c, map.getOrDefault(c, 0) + 1)
遍历方式选对了,效率和可读性都提升
别只用 keySet() 再 get —— 多一次哈希查找:
- 要键和值都用:优先
entrySet()遍历,for (Map.Entry<k> e : map.entrySet())</k> - 只要值:用
values(),比先取 key 再 get 更直接 - Java 8+ 可结合 Stream,如
map.entrySet().stream().filter(...).collect(...),但大数据量慎用,有装箱和迭代开销
自定义类作 key?必须重写 hashCode 和 equals
这是新手踩坑最多的地方:
- 不重写 → 默认用 Object 的 hashCode(基于内存地址),两个逻辑相等的对象哈希值不同,
get()找不到 - 只重写 hashCode 不重写 equals →
containsKey()可能返回 false,即使对象内容一样 - IDE 通常支持一键生成(Alt+Insert / ⌘N),确保两个方法依据相同字段计算
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










