java中找第一个不重复字符的核心思路是:先用hashmap或数组统计各字符频次,再按原字符串顺序遍历查找首个计数为1的字符;需处理空串、全重复等边界情况。

Java 中找出字符串中第一个不重复的字符,核心思路是:先统计每个字符出现次数,再从左到右遍历原字符串,找到第一个计数为 1 的字符。
用 HashMap 统计频次 + 遍历原字符串
这是最直观、易理解的方法。HashMap 存储字符 → 出现次数映射,再按原始顺序扫描确认首个唯一字符。
- 第一遍遍历字符串,用 HashMap
记录每个字符的出现次数 - 第二遍仍按字符串索引顺序遍历(不是遍历 map),对每个字符查 map 值,遇到第一个值为 1 的就返回它
- 注意:必须用原字符串遍历,因为 HashMap 不保证插入顺序(Java 8+ 虽然底层是链表+红黑树,但遍历 keySet() 仍不等价于原始顺序)
用 LinkedHashMap 优化(可选,逻辑更紧凑)
如果想只遍历一次字符串完成统计和定位,可用 LinkedHashMap 记录字符首次出现位置,并在第二次扫描时跳过重复项。但实际仍需两次逻辑扫描,常见写法仍是两遍。
- 更实用的变体:用 LinkedHashMap
,第一次遍历时存「字符 → 第一次出现下标」;若重复出现,把 value 设为 -1 - 之后遍历 LinkedHashMap 的 values(),找第一个 ≠ -1 的下标,再取原字符串对应位置的字符
- 本质仍是“标记+查找”,但避免了二次调用 get(),适合对性能有微调需求的场景
用数组代替 HashMap(仅限 ASCII 字符)
如果确定字符串只含 ASCII(如 a-z、A-Z、0-9),可用长度 256 的 int 数组替代 HashMap,提升效率、避免装箱开销。
- 声明 int[] count = new int[256]
- 遍历字符串:count[ch]++(ch 是 char,自动转为 int 索引)
- 再遍历字符串,对每个 ch 检查 count[ch] == 1,成立则立即返回 ch
- 内存占用小、访问快,但不适用于 Unicode 字符(如中文、emoji)
返回结果与边界处理
别忘了考虑空串、全重复、无非重复字符等边界情况。
- 字符串为 null 或 length == 0,建议直接返回 null 或抛 IllegalArgumentException
- 遍历完没找到,可返回 '\0'、null、或抛 NoSuchElementException,根据业务定
- 示例:“abaccdeff” → 返回 'b';“aabbcc” → 无解;“” → 抛异常或返回特殊值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











