Java自动装箱的陷阱

今天看《深入理解Java虚拟机》,其中作者留了一段代码,让读者自己试试,运行结果和我预想的完全不一致,因此记录下来,做个总结。

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 :"+(c == d));
        System.out.println("e == f :"+(e == f));
        System.out.println("c == (a + b) :"+(c == (a + b)));
        System.out.println("c.equals(a + b) :"+c.equals(a + b));
        System.out.println("g == (a + b) :"+(g == (a + b)));
        System.out.println("g.equals(a + b) :"+g.equals(a + b));

以上代码输出结果如下:

c == d :true
e == f :false
c == (a + b) :true
c.equals(a + b) :true
g == (a + b) :true
g.equals(a + b) :false

这里有两个疑惑:

为什么 c == d 但是 e != f?

这其中有两个原因,一是Integer赋值过程自动装箱;二是-128~127范围内的Integer的cache。

  • 自动装箱
 Integer c = 3

编译后结果如下:

 Integer c = Integer.valueOf(3);
  • -128~127范围内的Integer的cache
    -128~127范围内的数据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);
    }
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
}

基于以上两条,才会出现c == d 但是 e != f这种情况

为什么 g == (a + b) 但是g.equals(a + b) == false

这是因为,编译期间遇到算术运算符会自动拆箱(⚠️==运算在不遇到算术运算符的情况下不会自动拆箱):

System.out.println("g == (a + b) :"+(g == (a + b)));

编译结果如下:

 System.out.println("g == (a + b) :"+(g.intValue() == (a.intValue() + b.intValue()));

因此,才会出现g == (a + b)
至于g.equals(a + b) == false,完全是由于对象类型不一致(Long和Integer)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,101评论 18 399
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,149评论 0 11
  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 5,071评论 0 4
  • 下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题...
    独念白阅读 5,229评论 0 3
  • walk漫阅读 1,300评论 0 0