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
相关产品推荐
相关产品推荐

