JDK5新特性:自动装箱和自动拆箱

亮哥分享:
一种技术的出现,肯定是为了解决某种技术的不足。

最近复习了一遍Java基础,受益匪浅。
第一遍学Java知识,是为了找工作。简单了解了一下java的思想和语法,掌握一些工作中经常用到的知识(常用的数据结构、IO流、多线程、数据库、框架等等)
工作几年后再来看一遍Java知识,你会更关注一些细节,有更多的思考,掌握一些解决问题的思想。

今天我们来了解一下JDK5的新特性之一:自动装箱和拆箱。后续我还会继续总结一些其他的JDK5和JDK7的新特性。

说道自动装箱和拆箱,首先我们需要知道基本数据类型包装类。
java提供了四类八种基本数据类型,但是有些需求,靠基本数据类型无法满足我们的需求,或者是不方便。例如做一些进制转换,获取int数据类型的取值范围等等。
我们知道,类的优点在于,它可以定义成员变量、成员方法,提供丰富便利的功能。因此Java在JDK1.0的时候就设计了基本数据类型的包装类。对应关系如下图:
JDK5新特性:自动装箱和自动拆箱_第1张图片

这样的话,我们做一些操作会很方便:
例1:将100这个十进制数,分别转换为二进制,八进制,十六进制。
int x = 100;
System.out.println(“2进制:”+Integer.toBinaryString(x)); //2进制:1100100
System.out.println(“8进制:”+Integer.toOctalString(x)); //8进制:144
System.out.println(“16进制:”+Integer.toHexString(x)); //16进制:64

例2:判断一个数据是否在int数据范围内
int x = 100000;
System.out.println(“int min=” + Integer.MIN_VALUE); //int min=-2147483648
System.out.println(“int max=” + Integer.MAX_VALUE); //int max=2147483647
System.out.println((x >= Integer.MIN_VALUE && x <= Integer.MAX_VALUE)); //true

体会到了基本数据类型包装成对象的好处之后,我们再来看自动装箱和自动拆箱。
自动装箱:把基本数据类型转换为包装类类型。
自动拆箱:把包装类类型转换为基本数据类型。

说一堆概念,不如代码说明。
行1:Integer i1 = new Integer(10);
行2:Integer i2 = 100;
行3:1i2+=200;

我们来分析一下,这三行代码分别做了什么事情:
Integer i1 = new Integer(10);
这很简单,使用了Integer的构造器,创建了一个Integer对象实例,将一个int类型的数据包装成了Integer类型。

Integer i2 = 100;
第二行,有点奇怪,100默认是int类型的,怎么能赋值给Integer,这就用到了JDK5的新特性,自动装箱。将100包装成了包装类。怎么验证呢?很简单,我们看看java编译器做了什么事情,使用反编译软件,看一看:
Integer i2 = Integer.valueOf(100);
原来,编译器使用了Integer类的valueOf()方法,将int类型的100包装成Integer类型。
JDK5新特性:自动装箱和自动拆箱_第2张图片

1i2+=200;通过反编译软件看看第三行代码的原理:
i2 = Integer.valueOf(i2.intValue() + 200);
注意:计算机做整形数据的加减法,是用int计算的,其实最底层是靠int数据的二进制的补码做加减法的。
首先使用Integer的intValue()方法拿到Integer类型i2的int数据(这里用到了自动拆箱)。先做int数据的加减法,将int类型的结果,再靠Integer的valueOf()方法自动装箱成Integer类型,赋给i2

总结一下:
Integer与int类型的装箱和拆箱,分别是通过Integer.valueOf()和Integer.intValue()实现的。

注意:在使用拆装箱操作的时候,需要注意判断对象不要为null,否者java.lang.NullPointerException
Integer i = null;
i+=200;
System.out.println(“i:”+i);


更多文章,请用微信扫码关注我的微信公众号【亮哥的IT职场】
JDK5新特性:自动装箱和自动拆箱_第3张图片


你可能感兴趣的:(JDK5新特性:自动装箱和自动拆箱)