You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 290疑问:int与Integer循环变量为何结果不同?

LeetCode 290 单词规律:int vs Integer循环变量的结果差异

问题场景

在实现LeetCode 290《单词规律》的双射判断逻辑时,利用HashMap的put方法返回旧值的特性验证字符与单词的对应关系。针对特定测试用例(pattern为大量c后接dd,s为大量s后接tt),使用int i作为循环变量时返回false,改用Integer i则返回正确的true,需明确两者差异的原因。

核心原因分析

1. Integer自动装箱与缓存机制

Java中int转Integer的自动装箱依赖Integer.valueOf(int)方法:

  • 对于-128 ≤ i ≤127的整数,方法会复用缓存池中的Integer对象;
  • 超出该范围时,会创建新的Integer实例。

2. int循环变量的问题

当循环变量为int i时,循环体中两次map.put调用的i会分别自动装箱:

  • 当i ≤127:两次装箱得到缓存池中的同一个对象,两个key关联的value引用相同,后续put返回的旧值引用一致,!=比较结果为false,逻辑正常。
  • 当i >127:两次装箱生成两个不同的Integer对象(即使数值相同),此时字符和单词对应的value是不同的引用。后续再次处理这两个key时,map.put返回的旧值是两个不同的对象,!=比较引用时结果为true,错误触发return false。

3. Integer循环变量的正确性

当循环变量为Integer i时,循环体中两次map.put调用使用的是同一个Integer实例(当前循环的i变量),因此字符和单词对应的value是同一个引用。无论i是否超出缓存池范围,后续put返回的旧值引用始终一致,!=比较结果为false,逻辑正确。

额外优化方案

如果不想依赖Integer循环变量,可以改用Objects.equals()比较返回值(比较数值而非引用),这样无论使用int还是Integer都能正确运行:

if (!Objects.equals(map.put(words[i], i), map.put(pattern.charAt(i), i))) {
    return false;
}

内容的提问来源于stack exchange,提问作者sucy1024

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:40