Integer、int、Integer.valueOf()、new Integer()

这样一个问题

Integer i1=59;
int i2=59;
Integer i3=Integer.valueOf(59);
Integer i4=new Integer(59);

System.out.println(i1 == i2);
System.out.println(i1 == i3);
System.out.println(i3 == i4);
System.out.println(i2 == i4);

运行一下Debug
Integer、int、Integer.valueOf()、new Integer()_第1张图片

i1和i3地址一样,i4地址不同。然后Integer与int进行比较的话,会自动拆箱,将Integer转换成int。
这样就很容易知道答案了。

true
true
false
true

如果这样呢?

Integer i1=128;
int i2=128;
Integer i3=Integer.valueOf(128);
Integer i4=new Integer(128);

System.out.println(i1 == i2);
System.out.println(i1 == i3);
System.out.println(i3 == i4);
System.out.println(i2 == i4);

运行一下Debug
Integer、int、Integer.valueOf()、new Integer()_第2张图片
i1、i3、i4地址都不一样。
所以运行结果很容易知道就是

true
false
false
true

解释原因
直接使用Integer包装类赋值,范围在[-128,127](闭区间)之间不会生成新的对象,直接把Java常量池中的对象拿来用,超过了范围就会申请在堆中new一个对象,然后双等于就是比较两者的内存地址是否一样。可以对照Integer源码分析。

Integer.valueOf()查看源码:

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

范围在[-128,127](闭区间)之间还是调用常量池(数组)中的对象,超过了这个范围就会new Integer(i),在堆中新建一个对象。

你可能感兴趣的:(Java基础语言)