我有一个带有整数数组和布尔数组的函数。如果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语句应该被触发两次,而只是触发一次。这是为什么?
答案 0 :(得分:5)
您应该使用Integer.equals()
来比较值,而不是Integer == Integer
,它会比较对象引用。您当前的代码字面上说“是200的第二个实例与第一个200的实例
两个选项:
int
,即int iHighestSum = 0;
Java将auto-unbox整数获取其int值,然后您将比较ints
,因此使用{{{ 1}} ==
:equals()
作为一个有趣的旁注,如果您将值if(integerArray[c].equals(iHighestSum))
更改为200
(或更少),您的代码将会通过。这是因为JVM在Integer类中为-128和127之间的所有值保持固定的可重用对象(即“字节”),即127
通过!
总而言之,这些更改中的任何一个都会使您的代码正常运行:
Integer[] integerArray = new Integer[] { 75, 127, 75, 127, 75 };