我有一个函数,它接受一个整数数组和一个 boolean 数组。如果 Integer 数组中的值为最高值且 boolean 数组为 true,则 trackerArray 中的值设置为 true。这是我的代码的简化版本,会产生错误...
package com.thisis.a.test;
public class ThisIsATest {
public static void main(String[] args){
Integer[] integerArray = new Integer[]{75,200,75,200,75};
boolean[] booleanArray = new boolean[]{false,true,false,true,false};
boolean[] trackerArray = new boolean[]{false,false,false,false,false};
Integer iHighestSum = 0;
for(int c = 0; c < booleanArray.length; c++){
if(booleanArray[c] == true)
if(integerArray[c] > iHighestSum)
iHighestSum = integerArray[c];
}
for(int c = 0; c < booleanArray.length; c++){
if(booleanArray[c] == true)
if(integerArray[c] == iHighestSum)
trackerArray[c] = true; // this if statement should be called twice
}
// trackerArray should be {false,true,false,true,false}
// instead it is {false,true,false,false,false}
}
}
trackerArray 应该是 {false,true,false,true,false},而不是 {false,true,false,false,false}。 if 语句应该触发两次,但实际上它只触发一次。这是为什么?
最佳答案
您应该使用比较值的Integer.equals()
,而不是比较对象引用的Integer == Integer
。您当前的代码字面意思是“200 的第二个实例与 200 的第一个实例是相同的实例”
两个选项:
- 将 iHighestSum 更改为
int
即int iHighestSum = 0;
Java 将 auto-unbox Integer 来获取其 int 值,然后您将比较ints
,因此使用==
是有效的
- 更改比较以使用
equals()
:if(integerArray[c].equals(iHighestSum))
有趣的是,如果您将值 200
更改为 127
(或更小),您的代码就会通过。这是因为 JVM 在 Integer 类中为 -128 到 127(即“字节”)之间的所有值保留固定的、可重用的对象,即 Integer[] integerArray = new Integer[] { 75, 127, 75, 127, 75 };
通过!
总而言之,这些更改中的任何一个都将使您的代码正常运行:
...
int iHighestSum = 0;
...
if(integerArray[c].equals(iHighestSum))
...
关于java - 比较 if 语句应该调用两次,但在比较 Integer 时只调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686506/