Java面试:for循环、对象/类引用和绑定限制

Tru*_*yen 3 java for-loop class object

这个问题出现在我用 Java 编写的实习职位面试问题之一中。请注意,布尔函数isSame实际上将 2 个参数声明为Integerclass - not int,所以我认为ab是对象,对吗?

public class ForLoop{

 public static boolean isSame(Integer a, Integer b) {
     return a == b;
 }

 public static void main(String []args){

    int i = 0;
    for (int j=0; j<500; ++j) {
        if (isSame(i,j)) {
            System.out.println("Same i = "+i);
            System.out.println("Same j = "+j);
            ++i;
            continue;
        } else {
            System.out.println("Different i = "+i);
            System.out.println("Different j = "+j);
            ++i;
            break;
        }
    }
    System.out.println("Final i = " + i);

 }
}
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是for循环将在第一次运行时终止并显示结果Final i = 1,但令我惊讶的是最终输出是i = 129. 当 i & j = 128 时循环终止。

  Same i = 126
  Same j = 126
  Same i = 127
  Same j = 127
  Different i = 128
  Different j = 128
  Final i = 129   
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

Ell*_*sch 5

当测试Object类型的相等性时.equals(),正如您发现的那样,-128 到 127(包含)被合并。JLS -5.1.7部分规定,

如果装箱的值 p 是 true、false、一个字节或一个在 \u0000 到 \u007f 范围内的字符,或者是-128 到 127(含)之间的intshort数字,则令 r1 和 r2 为任意两个的结果p的拳击转换。r1 == r2 的情况总是如此。