3

我有以下代码。

public static void doIntCompareProcess() {
    int a = 100;
    int b = 100;

    Integer c = 200;
    Integer d = 200;

    int f = 20000;
    int e = 20000;

    System.out.println(c == d);
    compareInt(e, f);
    compareInt(a, b);
}

public static void compareInt(Integer v1, Integer v2) {
    System.out.println(v1 == v2);
}

这给了我这个输出:

false
false
true

当前输出应该是:

false
false
false

为什么我得到错误的代码输出?

4

2 回答 2

11

最后一行对应于:

compareInt(100, 100);

由于compareInt()需要两个Integer对象,因此这两个参数会自动装箱。Integer(n) 在此过程中,小值的n实例会被实习。换句话说,compareInt()接收对同一个Integer(100)对象的两个引用。这就是导致最后一个比较评估为 的原因true

请参阅在 Java 中使用 == 运算符来比较包装器对象

底线是不要使用==运算符直接比较Integer对象。如需进一步讨论,请参阅https://stackoverflow.com/a/1515811/367273

于 2012-05-15T08:18:10.833 回答
3

出于性能原因,原始字节范围 -128 到 127 中的整数值被缓存。由于 100 是此范围内的值,因此每次都从缓存中返回相同的对象。对于不在此范围内的值,被认为不需要经常使用,并为它们返回新的 Integer 对象。现在,在您的情况下,您正在比较对象引用而不是值,并且由于 100 来自缓存,因此 compareInt() 中的参数指向同一个对象,因此比较等于 true。

于 2012-05-15T08:30:58.413 回答