有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java comparison if station应该调用两次,但在比较整数时只调用一次

我有一个接受整数数组和布尔数组的函数。如果整数数组中的值是最高值,而布尔数组为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}。if station应该触发两次,但只触发一次。这是为什么


共 (1) 个答案

  1. # 1 楼答案

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

    有两种选择:

    1. 将iHighestSum更改为intint iHighestSum = 0;Java将auto-unbox整数以获取其int值,然后您将比较ints,因此使用==是有效的
    2. 将比较改为使用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))
    ...