整数比较值的输出错误

时间:2012-05-15 08:16:48

标签: java comparison integer int

我有以下代码。

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

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

2 个答案:

答案 0 :(得分:11)

最后一行对应于:

compareInt(100, 100);

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

请参阅Using == operator in Java to compare wrapper objects

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

答案 1 :(得分:3)

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