Java中的装箱与拆箱
装箱:
一是因为Java是一种面向对象语言,而int、float、char等等的一些的基本数据类型,不具备调用方法的功能,但Java是面向对象语言,如果基本数据类型想调用Java中的方法,那么就需要创建一次对象,这非常麻烦,所以在JDK1.5之后Java中就自动封装了基本数据类型的对象方法,而且。共有八种,分别是
int Integer
byte Byte
short Short
long Long
float Float
double Double
char Character
boolean Boolean
一句话解释,就是,如果想进行加减乘除等基本运算,就用基本数据类型,如果想象对象一样对数据类型进行操作,就用Integer类型。
举例:
public class zhuangxiang { public static void main(String[] args) { Integer i= 10; System.out.println(i.toString());//正确,因为装箱过后就可以调用Object类中的方法 object类中的方法详情看下表。 int ii=20; System.out.println(ii.toSting()); //不正确,因为int是基本数据类型,不能调用方法 System.out.println(ii);//正确
} }
//运行结果:报错
拆箱:
有装箱,对应的就应该有拆箱,因为对象类型的数据类型必要时也需要进行基本运算,拆箱其实很简单,例如 :
Integer i = 10;
int n = i;
这两句语句就完成了装箱与拆箱操作。下面通过几个题来详细了解一下。(在此感谢大佬Matrix海子提供免费支持,链接:https://www.cnblogs.com/dolphin0520/)
测试:
下面我们来看下面代码的运行结果是什么://看图计算出下列代码会在输出生么结果!
public class zhuangxiang { public static void main(String[] args) { Integer i1 = 100; int i = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1 == i2); System.out.println(i == i1); System.out.println(i3 == i4);
} }
我们可能会输出 ture ,ture ,ture。再看答案之前我们应该思考为什么我们会得出这个结果(千万不要靠蒙呦),我们可能会认为i,i1,i2数值都相等,i3,i4也相等,所以他们会相等。其实不然,答案是
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //是不是有意思不可思议 2 true 3 true 4 false
看到答案之后是不是不太理解,我也一样,然后我去看官方API文档,文档上解释道:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//Interger的valueOf方法实现源代码 public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }
而其中IntegerCache类中的实现为:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private static class IntegerCache { static final int high; static final Integer cache[]; static { final int low = -128; // high value may be configured by property int h = 127; if (integerCacheHighPropValue != null) { // Use Long.decode here to avoid invoking methods that // require Integer's autoboxing cache to be initialized int i = Long.decode(integerCacheHighPropValue).intValue(); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - -low); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
由此我们知道当Integer的值超过127,或者小于-128时会重新创建一个新的对象。由于Integer数值在区间[-128,127],所以i1和i2其实指的是统一对象,而i3,i4超过区间,所以指的不是同一对象。至于i 和 i2结果,是因为i和i2比较的是数值,而不是内存中的对象。
应该注意的是,当我们用Integer进行加减法时,系统会自动进行拆装箱。例如:
package com.zhuangxiang; public class zhuangxiang { public static void main(String[] args) { Integer ii = 100; ii += 200; System.out.println(ii); } } //反编译文件, //package com.zhuangxiang; // // import java.io.PrintStream; // //public class zhuangxiang //{ // // public zhuangxiang() // { // } // // public static void main(String args[]) // { // Integer ii = Integer.valueOf(100); // ii = Integer.valueOf(ii.intValue() + 200); // System.out.println(ii); // } //}
由反编译文件,我们知道,当Integer类型的数字进行加法操作时,实际上是拆箱成int类型的数字进行加减法操作。
Attention:当Integer类型的变量赋值为null时,不能进行自动拆装箱。
public class zhuangxiang { public static void main(String[] args) { Integer ii = null; ii += 200; System.out.println(ii); } }
报错信息:Exception in thread "main" java.lang.NullPointerException//即空指针异常
at com.zhuangxiang.zhuangxiang.main(zhuangxiang.java:6),所以在使用Integer进行拆装箱时,不能给Integer类型的变量赋值为null。
详情:https://www.cnblogs.com/dolphin0520/p/3780005.html