有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中为相同代码包装不同的输出

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

上面的代码在..时给了我“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");
    }
}

上面的代码告诉我“true”


共 (3) 个答案

  1. # 1 楼答案

    包装类中的缓存

    对于-128到127之间的值,Integer具有内部缓存

    因此,对于此范围内的数字,将返回相同的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,而不是标识

    如果要比较两个Integer,应该使用i.equals(j),就像正确比较String的值一样。还要记住,任何将取消对Integer的装箱的操作都会对Integer.intValue()进行隐式调用,因此记住要小心进行这些调用,要知道Integer的值可能为空

  2. # 2 楼答案

    要比较对象的内容(而不是它们的标识),请使用equals而不是==。这将产生一致的结果

  3. # 3 楼答案

    包装类Integer具有-127到127的内部缓存。因此,当您分配相同的值时,该范围内的值将返回相同的实例。对于1000,返回两个不同的“new”ed实例,给出false on==comparison

    如果使用int而不是Integer,结果将不会令人惊讶。为了使结果与您的方法一致,请使用equals()方法而不是==