Java中相同代码的不同输出

时间:2013-09-18 08:04:21

标签: java wrapper

我是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");
    }
}

上面的代码给我“真实”

3 个答案:

答案 0 :(得分:10)

在包装类中缓存

Integer具有内部缓存,范围为-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

缓存的目的

目的主要是 save memory ,由于更好的缓存效率,这也可以带来更快的代码。

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

如果您要比较两个Integer,则应使用i.equals(j),就像正确比较String s的值一样。另请注意,将Integer取消隐藏的任何操作都会对Integer.intValue()进行隐式调用,因此请务必仔细进行这些调用,了解您的Integer何时可能为空。

答案 1 :(得分:1)

要比较对象的内容(而不是其身份),请使用equals代替==。这将产生一致的结果。

答案 2 :(得分:0)

包装类Integer具有-127到127的内部缓存。因此,当您指定在此范围内的相同值时,将返回相同的实例。对于1000,返回两个不同的'新'实例,在==比较时给出错误。

如果您使用int代替Integer,结果就不会令人惊讶。要获得与您的方法一致的结果,请使用equals()方法而不是==