1.什么是自动装箱和自动拆箱
java中为没一种基本类型都提供相应的包装类型。
byte,short,char,int,long,float,double和boolean
Byte,Short,Character,Integer,Long,Float,Double,Boolean。
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。因为这里的装箱和拆箱是自动进行的非人为转换,所以就称作为自动装箱和拆箱。
2.原理
例如:Integer i = 100;
Java虚拟机会自动调用Integer的valueOf方法,编译为:Integer i = Integer.valueOf(100);
拆箱:
Integer i = 10; //装箱
int t = i;
Java虚拟机会自动调用Integer的intValue方法, 编译为:int t=i.Integer.intValue();
3.注意的问题:
1.自动装箱和拆箱,要注意空指针的问题。 拆箱的如果为Null,则会报空指针异常。
2.缓存问题。
第一段代码:
public class TestMain { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = 200; Integer i4 = 200; System.out.println(i1 == i2); System.out.println(i3 == i4); } }
运行结果为:
true false
第二段代码:
public class TestMain { public static void main(String[] args) { Double d1 = 100.0; Double d2 = 100.0; Double d3 = 200.0; Double d4 = 200.0; System.out.println(d1 == d2); System.out.println(d3 == d4); } }
运行结果:
false false
说明:
equals() 比较的是两个对象的值(内容)是否相同。
"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
产生上面的结果的原因是:Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法是以128位分界线做了缓存的,假如是128以下且-128以上的值是会取缓存里面的引用的,以Integer为例,其valueOf(int i)的源代码为:
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); }
而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。关于这个小知识点,个人提出两点意见:
1、不重要,除了面试考察求职者对于知识的掌握程度,没多大用
2、要有缓存这个概念,缓存对于提高程序运行效率、节省内存空间是有很大帮助的
转载地址:http://www.cnblogs.com/xrq730/p/4869065.html