java自动装箱和拆箱分析

java的自动装箱和拆箱过程,平常没怎么关注,但是在面试的时候,会经常被问起,大家是否能完全明白呢?
接下来,我们直接通过实例来来分析和总结
static void m2(){
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
int h = 127;
Integer i = 127;
Integer m =127;
int j = 128;
Integer k = 128;
Integer l = 128;
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));
System.out.println( h == i);
System.out.println( i == m);
System.out.println( j == k);
System.out.println( k == l);
}
上面的依次输出结果是:
true
false
true
true
true
false
true
true
true
false
只看上面的代码,有同学可能会有点疑问,我们先编译为class文件后再用反编译工具查看反编译结果(这样能消除语法糖,看到代码的基础本质)
//消除语法糖后的代码如下:
static void m2() {
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);
int h = 127;
Integer i = Integer.valueOf(127);
Integer m = Integer.valueOf(127);
int j = 128;
Integer k = Integer.valueOf(128);
Integer l = Integer.valueOf(128);
System.out.println(c == d); //true 因为Integer.valueOf()对[-127,127]闭区间之间的数字做了缓存(可查看源码 Integer,Byte,Long ,Short 都有缓存) ,也就是c和d是同一个对象
System.out.println(e == f);//false 不在[-127,127]之间,每次valueOf()返回的是新对象
System.out.println(c.intValue() == a.intValue() + b.intValue());//true 运算时做了拆箱操作,最终比较的是int 值
System.out.println(c.equals(Integer.valueOf(a.intValue() + b.intValue())));//true 查看基本类型的引用类型的equals()方法,首先判断类型是否相同,再判断value是否相等,这里都是Ineger类型
System.out.println(g.longValue() == a.intValue() + b.intValue());//true 基本类型的int long 值相同 333l == 333 (true) int 与 long 进行运算、比较时 int 会自动进行类型提升为 long 类型
System.out.println(g.equals(Integer.valueOf(a.intValue() + b.intValue())));//false 类型不一样
System.out.println(h == i.intValue()); //true 相同值
System.out.println(i == m); //true 同一缓存
System.out.println(j == k.intValue()); //true 相同值
System.out.println(k == l); //false 不在[-127,127]之间,每次valueOf()返回的是新对象
}

你可能感兴趣的:(java)