比较两个Short对象会产生意外结果

时间:2013-09-20 02:00:09

标签: java

我执行下面的代码得到了一些令人惊讶的结果

class Test {
    public static void main(String[] args) {
       Short i = 122, j = 122;
       if (i == j) {
            System.out.println("true");
       } else {
        System.out.println("false");
      }
    }
 }

 class Test {
    public static void main(String[] args) {
       Short i = 1222, j = 1222;
       if (i == j) {
            System.out.println("true");
       } else {
        System.out.println("false");
      }
    }
 }

当我执行这些代码时,第一个代码输出true,而第二个代码输出false。 我知道当我们使用==比较对象时,它不会查找实际值,而只是比较引用。但在第一种情况下,它是在比较值,而在第二种代码中则没有。

1 个答案:

答案 0 :(得分:10)

Short具有内部缓存,其值范围为-128到127.因此,对于此范围内的数字,将返回Short的相同实例。使用==进行比较时,Java按实例进行比较,因此返回true。当数字超出此范围时,将创建两个不同的实例。因此,他们将在==比较失败,返回false

通过这种缓存,我们可以节省一些内存并拥有更快的代码。

从JDK 1.7源代码中查看以下方法。自1.5以来就一直存在这种情况

public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
                return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

这个缓存也适用于其他包装类;您可以查看Java文档以获取更多详细信息。