Java中Integer类的自动装箱和自动拆箱

来源:互联网 发布:避孕套品牌 知乎 编辑:程序博客网 时间:2024/06/12 01:47

所谓自动装箱,就是把基本数据类型用他们对应的引用类型包装起来,使他们可以具有对象的特质。例如我们可以把int类型包装成Integer类型的,把double类型的包装成Double类型的。

所谓拆箱,就是进行与自动装箱相反的操作。

自动装箱的过程:当需要一种类型的对象时,这种基本数据类型就自动封装到与它对应的包装类中。

自动拆箱的过程:当需要一个数值时,被装箱的对象中的值就会被自动提取出来,没有必要再去调用intValue()和doubleValue()等方法。

public static void main(String[] args) {Integer a=100;Integer b=100;Integer c=200;Integer d=200;System.out.println(a==b);//1System.out.println(a==100);//2System.out.println(c==d);//3System.out.println(c==200);//4}

在java中,"=="比较的是对象的引用,而不是值(value),自动装箱后a,b,c,d都是Integer类型的对象,因此"=="比较的是其引用。按照常规思维1和3应该是false,但是结果是:

true

true

false

true

2和4是因为进行了自动拆箱,比较的是基本数据类型,因此"=="比较的是其数值,结果数true。

对于结果1,虽然比较的是对象的引用,但是自动装箱时,java在编译的时候Integer a=100,被编译成Integer a=Integer.valueOf(100)。因此,关键就在于valueOf()这个方法。



再看下面的例子:

Integer aa=-128;Integer bb=-128;System.out.println(aa==bb);Integer cc=-129;Integer dd=-129;System.out.println(cc==dd);Integer ee=127;Integer ff=127;System.out.println(ee==ff);Integer gg=128;Integer hh=128;System.out.println(gg==hh);

上面代码输出的结果是:

truefalsetruefalse
说明当Integer类型后面赋值范围在-128---127之间时,都会返回true,否则返回false。


总结:

事实上,java为了提高效率,IntegerCache类中有一个数组缓存了值从-128到127的Integer对象。当我们调用Integer.valueOf(int i)的时候,如果i的值是>=-128且<=127时,会直接从这个缓存中返回一个对象,否则就new一个Integer对象。