7

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

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输出。我知道当我们使用它比较对象时,==它不会寻找实际值,而只是比较引用。但在第一种情况下,它会比较值,而在第二个代码中则不会。

4

1 回答 1

11

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

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

从 JDK 1.7 Source Code 中查看以下方法。自 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 文档以获取更多详细信息。

于 2013-09-20T02:01:23.563 回答