Java中int与Integer的最大值是否相同?HackerRank问题解惑
问题解答
1. int 和 Integer 的最大值完全一致
没错,两者的存储上限是完全相同的:
- 基本类型
int的最大值为2^31 - 1(即2147483647) - 包装类
Integer通过常量Integer.MAX_VALUE定义最大值,数值同样是2147483647
题目中蜡烛高度的最大值仅为10^7,远低于这个上限,所以存储范围不是导致用例失败的原因。
2. 改成 Integer 类型后用例失败的核心原因
问题出在 == 的比较逻辑上:
当 maxElement 是 Integer 类型时,element == maxElement 比较的是两个 Integer 对象的内存引用,而非它们的实际数值。
Java 对 Integer 有自动装箱缓存机制:对于 -128 到 127 之间的整数,JVM会复用缓存中的对象,此时用 == 对比数值相同的对象会返回true;但当数值超过127时,每次装箱都会创建新的 Integer 对象,哪怕数值一致,== 对比引用也会返回false,导致相等的蜡烛高度无法被正确计数,最终部分用例执行失败。
而使用 int 类型时,element(Integer类型)会自动拆箱为 int,所有比较都是基于基本类型的数值,逻辑完全正确。
3. 用 Integer 作为 maxElement 的修复方案
只需要把引用对比改为数值对比即可,两种可行方式:
方法一:使用 equals() 方法对比数值
public static int birthdayCakeCandles(List<Integer> candles) { Integer maxElement = 0; Integer maxElementCount = 0; for(Integer element: candles) { if (element > maxElement) { maxElement = element; maxElementCount = 1; } else if (element.equals(maxElement)) { // 替换为equals比较数值 maxElementCount++; } } return maxElementCount; }
方法二:手动拆箱为int后对比
public static int birthdayCakeCandles(List<Integer> candles) { Integer maxElement = 0; Integer maxElementCount = 0; for(Integer element: candles) { if (element > maxElement) { maxElement = element; maxElementCount = 1; } else if (element.intValue() == maxElement.intValue()) { // 拆箱后比较数值 maxElementCount++; } } return maxElementCount; }
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

