java - 比较 if 语句应该调用两次,但在比较 Integer 时只调用一次

标签 java

我有一个函数,它接受一个整数数组和一个 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 的第一个实例是相同的实例”

两个选项:

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

相关文章:

java - LibGDX:如何实现 Google Play 游戏服务?

java - 一个匿名类可以有多少个实例?

java - java 包含特定字符的字符串数组列表

java - 显示多个 JPopupMenus

java - 他们为什么使用本指南中的界面

java - 关闭 Sonar 中的资源违规

java - 图java的深度优先搜索

java - 如何用angularjs显示 Controller 返回的jsp页面

java - 是否有一种聪明的方法来单元测试 AspectJ 策略执行方面?

java - 要通过 Maven 包含在 Eclipse 中的 Tomcat 库