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

7 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");
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

 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");
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

Val*_*ade 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 此缓存与处理器缓存内存没有任何关系*.该声明完全没有关系. (5认同)