当前位置: 首页 > 知识库问答 >
问题:

在java中,逻辑上相似的方法能给出不同的结果吗?[副本]

霍浩皛
2023-03-14

我试图在黑客级别解决这个问题,我注意到了一些事情。

这个问题的函数失败了一些测试用例,我向你保证,这不是由于运行时错误。

public static int functionA(List<Integer> a) {
    int min = -1, size = a.size();

    for (int i = 0; i < size; i++){
        for (int j = i + 1; j < size; j++){
            if (j - i >= min && min != -1) break;
            if (a.get(i) == a.get(j)) min = j - i;
        }
    }

    return min;
}

这个方法有点不同,但逻辑上与前面的方法相同。使用此方法,它通过了所有测试用例。

public static int functionB(List<Integer> a) {
    int min = -1, size = a.size();

    for (int i = 0; i < size; i++){
        int temp = a.get(i);
        for (int j = i + 1; j < size; j++){
            if (j - i >= min && min != -1) break;
            if (temp == a.get(j)) min = j - i;
        }
    }

    return min;
}
    

我在我的计算机上运行了代码,发现第一个函数对此测试用例给出了错误的答案(输出-1)。

我没有收到任何编译器警告,或者有什么东西可以打开“所有”编译器警告?

共有1个答案

殷承恩
2023-03-14

这里的显著区别是,在第一种情况下,您使用==来比较对象(而不是您应该使用的equals())。它仅适用于-128127范围内的整数对象,这些对象被缓存,并且=的工作方式与原语相同。

在第二种情况下,您将在temp中将整数解装箱到int,因此使用与=的原始比较(get()的结果也将被解装箱),并且它可以工作对所有值正确。

IDE可能有不同的检查,这些检查将警告比较整数值与=(以及其他潜在错误的负载)。

 类似资料: