比较如果应该调用两次语句,但在比较一个整数时只调用一次

b10*_*ard 0 java

我有一个函数,它采用一个整数数组和一个布尔数组.如果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}
    }
}
Run Code Online (Sandbox Code Playgroud)

trackerArray应为{false,true,false,true,false},而不是{false,true,false,false,false}.if语句应该被触发两次,而只是触发一次.为什么是这样?

Boh*_*ian 5

您应该使用比较对象引用的Integer.equals()值,而不是比较值Integer == Integer.您当前的代码字面上说"是与200的第一个实例相同的实例 200的第二个实例"

两种选择:

  1. 将iHighestSum更改为,intint iHighestSum = 0;Java将自动取消整理 Integer以获取其int值,然后您将进行比较ints,因此它有效使用==
  2. 更改您的比较使用equals(): if(integerArray[c].equals(iHighestSum))

作为一个有趣的旁注,如果您将值更改200127(或更少),您的代码将通过.这是因为JVM在Integer类中保留了固定的,可重用的对象,用于-128到127之间的所有值(即"字节"),即Integer[] integerArray = new Integer[] { 75, 127, 75, 127, 75 };通过!

总而言之,这些更改中的任何一个都将使您的代码正常运行:

...
int iHighestSum = 0;
...
if(integerArray[c].equals(iHighestSum))
...
Run Code Online (Sandbox Code Playgroud)