【问题标题】:different output for same code in JavaJava中相同代码的不同输出
【发布时间】:2013-09-18 08:04:20
【问题描述】:

我是 Java 新手。我对包装类和原始数据类型有所了解,但我遇到的情况令人惊讶。将变量 i 和 j 的值从 1000 更改为 100 时,输出从 false 更改为 true。我需要知道这背后的机制。

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

上面的代码给了我“假”,而..

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

上面的代码给我“真”

【问题讨论】:

  • 每天都会出现这个或类似的问题。这是一些教科书的例子吗?我在真正的现场编程中从来没有遇到过这个问题。
  • @OrhanC1 看看加你编辑的问题,好像你加了多余的}
  • @bummi 啊!你是对的。对不起。

标签: java wrapper


【解决方案1】:

包装类中的缓存

整数具有 内部缓存,其值范围为 -128 到 127。

因此,对于此范围内的数字,将返回相同的 Integer 实例。 == 按实例进行比较,因此100 使用相同的实例。

源 JDK 1.6:

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }

Caching in wrapper classes Java

缓存的目的

目的主要是节省内存,也因为缓存效率更高,代码速度更快。

比较值时使用.equals,而不是身份

如果您要比较两个Integers,您应该使用i.equals(j),就像正确比较Strings 的值一样。还要记住,任何将Integer 拆箱的操作都会隐式调用Integer.intValue(),因此请记住谨慎进行这些调用,知道您的Integer 何时可能为空。

【讨论】:

  • 没问题,很好的答案,只是想我会说清楚,以防它不明显。
  • 我想知道谁选择了这个值范围(-128 到 127),为什么?为什么不是更高的范围?
【解决方案2】:

要比较对象的内容(而不是它们的身份),请使用equals 而不是==。这将给出一致的结果。

【讨论】:

    【解决方案3】:

    包装类Integer 具有-127 到127 的内部缓存。因此,当您分配在此范围内的相同值时,将返回相同的实例。对于 1000 个不同的“新”实例,在 == 比较时返回 false。

    如果您使用int 而不是Integer,结果将不足为奇。为了与您的方法保持一致的结果,请使用 equals() 方法而不是 ==

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多