1.引言
下面一段代码,其输出结果如下所示。本文主要讲解输出的原因。
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);//true
System.out.println(c == d);//false
2.原因分析
上面一段代码在编译之后,对于Integer的构造会有自动装箱的过程。所以上面的代码等价于下面的代码。
Integer a = Integer.valueOf(127);
Integer b = Integer.valueOf(127);
Integer c = Integer.valueOf(128);
Integer d = Integer.valueOf(128);
System.out.println(a == b);//true
System.out.println(c == d);//false
我们又知道使用==进行对象的比较时,是对其引用进行的比较。
我们查看Integer.valueOf(int)方法的源码,发现Integer在构造对象时,会先判断值的大小,若该值在一定范围内,则会从cache中获得对象,而不会new一个新的对象。
3.Integer.IntegerCache
IntegerCache是Integer私有的静态的内部类。其中包含一个Integer类型的静态数组cache。并且有一段静态代码块,在类加载时就会构造cache数值,之后在创建Integer对象时,就会优先从cache中获得对象。从源码中我们可以看出cache默认的范围是-128 到 127,也就是说使用Integer.valueOf方法构造Integer对象时,若值在-128到127之间是不会创建新的对象的,而是直接从cache数值中获得。所以1、2两段中的 ab 结果为true,而cd结果为false。