比较if语句应该被调用两次但是在比较一个Integer时只调用一次

时间:2011-07-13 22:34:21

标签: 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}
    }
}

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

1 个答案:

答案 0 :(得分:5)

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

两个选项:

  1. 将iHighestSum更改为int,即int iHighestSum = 0; Java将auto-unbox整数获取其int值,然后您将比较ints,因此使用{{{ 1}}
  2. 更改您的比较以使用==equals()
  3. 作为一个有趣的旁注,如果您将值if(integerArray[c].equals(iHighestSum))更改为200(或更少),您的代码将会通过。这是因为JVM在Integer类中为-128和127之间的所有值保持固定的可重用对象(即“字节”),即127通过!

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

    Integer[] integerArray = new Integer[] { 75, 127, 75, 127, 75 };