详解java包装类自动拆箱和装箱(SoEasy你必须懂得)

很简单,下面两句代码就可以看到装箱和拆箱过程

简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

下面我们来看看需要装箱拆箱的类型有哪些:

详解java包装类自动拆箱和装箱(SoEasy你必须懂得)(1)

这个过程是自动执行的,那么我们需要看看它的执行过程:

1 public class Main { 2 public static void main(String[] args) { 3 //自动装箱 4 Integer total = 99; 5 6 //自定拆箱 7 int totalprim = total; 8 } 9 }

Integer total = 99;

执行上面那句代码的时候,系统为我们执行了:

Integer total = Integer.valueOf(99);

int totalprim = total;

执行上面那句代码的时候,系统为我们执行了:

int totalprim = total.intValue();

就以Integer为例,来分析一下它的源码:

1、首先来看看Integer.valueOf函数

1 public static Integer valueOf(int i) { 2 return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i 128]; 3 }

它会首先判断i的大小:如果i小于-128或者大于等于128,就创建一个Integer对象,否则执行SMALL_VALUES[i 128]。

首先我们来看看Integer的构造函数:

1 private final int value; 2 3 public Integer(int value) { 4 this.value = value; 5 } 6 7 public Integer(String string) throws NumberFormatException { 8 this(parseInt(string)); 9 }

它里面定义了一个value变量,创建一个Integer对象,就会给这个变量初始化。第二个传入的是一个String变量,它会先把它转换成一个int值,然后进行初始化。

下面看看SMALL_VALUES[i 128]是什么东西:

1 private static final Integer[] SMALL_VALUES = new Integer[256];

它是一个静态的Integer数组对象,也就是说最终valueOf返回的都是一个Integer对象。

所以我们这里可以总结一点:装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。

2、接着看看intValue函数

1 @Override 2 public int intValue() { 3 return value; 4 }

这个很简单,直接返回value值即可。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页