|
北大青鸟 - 南京北大青鸟首席软件工程师培训机构 全国免费咨询热线:400-885-5191(我要就业) 校址:南京市白下区建邺路66号3层 (张府园地铁3号出口)
.jpg)
从今天开始,我们来了解JDK6给我们带来的新特性,希望对大家以后的开发有所帮助
基本数据类型的自动装箱、拆箱是自J2SE5.0开始提供的功能,虽然打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,这就是方便的代价。
在Java中,所有要处理的东西几乎都是对象,例如String,然而基本数据类型不是对象,也就是使用int、double、boolean等定义的变量。而使用Java有一段时间的人都知道,有时需要将基本类型转换为对象,例如使用List添加元素时,需要传入的参数是对象而不是基本数据类型。
传统的编程模式中,要使用以下语句才能将int包装为一个Integer对象:
|
Integer integer=new Integer(10);
|
在JDK5之后提供了自动装箱的功能,可以直接使用以下语句打包基本数据类型:
在进行编译时,编译器再自动根据书写的代码,判断是否进行自动装箱动作。而且同样的动作可以适用于boolean、byte、short、char、long、float、double等基本数据类型。
这种自动装箱(autoboxing)、拆箱(unboxing)的功能就被美其名曰:编译器蜜糖
下面这段代码程序就是直接使用自动装箱功能来编写的:
|
Integer num=100; //自动装箱
System.out.println (num/5); //自动拆箱,输出结果为20
|
自动装箱运用的方法还可以如下:
|
int i=10;
Integer integer=i;
|
也可以使用更一般化的java.lang.Number类来自动装箱。例如:
3.14f会先被自动装箱为Float,然后制定给number。
从JDK5开始可以自动装箱,也可以自动拆箱,也就是将对象中的基本数据形态信息从对象中自动取出,例如:
|
Integer integer=10;
int num=integer;
|
在运算时,也可以自动拆箱
|
Integer i=10;
System.out.println(i + 10);
System.out.println(i++);
|
布尔类型也可以自动拆箱
|
Boolean boo=true;
System.out.println(boo && false); //自动拆箱,显示false
|
注意:虽然自动装箱与自动拆箱很方便,但是程序运行阶段您得了解Java的语义,例如下面的程序是可以通过编译的:
这样的语法在编译时期是合法的,但是在运行的时候会有错误,因为这种写法相当于:
|
Integer i=null;
int j=i.intValue();
|
所以运行时会产生NullPointerException异常。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心,再来看一个程序:
|
Integer num1=100;
Integer num2=100;
System.out.println(num1==num2);
|
你认为输出的结果是什么呢?没错,就是true。下面我们把代码改一改
|
Integer num1=200;
Integer num2=200;
System.out.println(num1==num2);
|
输出的结果却是false,这有些另人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。
其实这个==运算符有关,我们都知道==是用于判断两个对象的内存地址是否相同,也就是两个引用名称是否参考一个对象。
自动装箱的时候,对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以第一个程序在比较时,为true,如果超过了这个范围,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以比较后的结果为false。
所以要记住:在内存中,只有单字节的数据装箱后才能重用,否则不会重用。
最后,我们通过一个示例程序再来印证一下这个理论
|
Character ch1='A';
Character ch2='A';
System.out.println (ch1==ch2); //打印true,因为数值A为单字节ASCII码字符集数据
|
|
Character ch1='马';
Character ch2='马';
System.out.println (ch1==ch2); //打印false,因为汉字马为双字节Unicode字符集数据
|
|