Java Integer Cache

Java Integer Cache
Java 代码

public class IntegerDemo {
    public static void main(String[] args) {
        Integer a = new Integer(1);
        Integer b = 1;
        int c = 1;
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(b == c);

        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }
}

运行结果

false
true
true
true
false

反编译代码

public class IntegerDemo {
    public static void main(String[] args) {
        Integer a = new Integer(1);
        Integer b = Integer.valueOf(1);
        int c = 1;
        System.out.println(a == b);
        System.out.println(a.intValue() == c);
        System.out.println(b.intValue() == c);

        Integer f1 = Integer.valueOf(100);
        Integer f2 = Integer.valueOf(100);
        Integer f3 = Integer.valueOf(150);
        Integer f4 = Integer.valueOf(150);
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }
}
public class Test {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c == (a + b));
        System.out.println(c.equals(a + b));
        System.out.println(g == (a + b));
        System.out.println(g.equals(a + b));
    }
}

运行结果

true
false
true
true
true
false

反编译代码

public class Test {
    public static void main(String[] args) {
        Integer a = Integer.valueOf(1);
        Integer b = Integer.valueOf(2);
        Integer c = Integer.valueOf(3);
        Integer d = Integer.valueOf(3);
        Integer e = Integer.valueOf(321);
        Integer f = Integer.valueOf(321);
        Long g = Long.valueOf(3L);
        System.out.println(c == d);
        System.out.println(e == f);
        System.out.println(c.intValue() == a.intValue() + b.intValue());
        System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));
        System.out.println(g.longValue() == a.intValue() + b.intValue());
        System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));
    }
}
解析 1、Byte,Short,Integer,Long 的缓存范围为[-128,127],Character 的缓存范围为[0,127]。 2、int 和 int 之间用 == 比较,肯定为 true。另外基本数据类型没有 equals 方法。 3、int 和 Integer 之间比较,Integer 会自动拆箱,== 和 equals 肯定都为 true。 4、int 和 new Integer 之间比较,Integer 会自动拆箱,调用 intValue 方法,所以 == 和 equals 肯定都为 true。 5、Integer 和 Integer 之间比较的时候,由于直接赋值的话会进行自动装箱。所以当值在[-128,127] 中的时候,由于值缓存在 IntegerCache 中,那么当赋值在这个区间的时候,不会创建新的 Integer 对象,而是直接从缓存中获取已经创建好的 Integer 对象。而当大于这个区间的时候,会直接 new Integer。 6、当 Integer 和 Integer 之间进行 == 比较的时候,在[-128,127] 区间的时候,为 true。不在这个区间,则为 false。 7、当 Integer 和 Integer 之间进行 equals 比较的时候,由于 Integer 的 equals 方法进行了重写,比较的是内容,所以为 true。 8、Integer 和 new Integer 之间比较:new Integer 会创建对象,存储在堆中。而 Integer 在[-128,127] 中,从缓存中取,否则会 new Integer。所以 Integer 和 new Integer 进行 == 比较的话,肯定为 false ;Integer 和 new Integer 进行 equals 比较的话,肯定为 true。 9、new Integer 和 new Integer 进行 == 比较的时候,肯定为 false ;进行 equals 比较的时候,肯定为 true。原因是 new 的时候,会在堆中创建对象,分配的地址不同,== 比较的是内存地址,所以肯定不同。 10、装箱过程是通过调用包装类的 valueOf 方法实现的。 11、拆箱过程是通过调用包装类的 xxxValue 方法实现的(xxx 表示对应的基本数据类型)。

参考资料

转载于:https://www.cnblogs.com/hglibin/p/10093099.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值