在講裝箱與拆箱之前我們要先了解一下這個(gè)問題的來源:
Java中的類型分為基本類型(Primitive type)和類類型(Class type)兩種:
基本類型包括byte型、char型、short型、int型、long型、float型、double型、boolean型八種?;绢愋椭傅氖侵苯影档妙愋停商峁┱Z言級(jí)別的支持。
類類型包括Byte、Character、Short、Integer、Long、Float、Double、Boolean。為什么要用類類型呢?原因其實(shí)很簡單,因?yàn)镴ava是一種面向?qū)ο蟮木幊陶Z言,所以操作對(duì)象是很總要的操作 ,而要產(chǎn)生對(duì)象就必須先定義類(類是對(duì)象的抽象,對(duì)象是類的實(shí)例),類類型提供了比基本類型更多的操作。
在Java版本增加自動(dòng)裝箱與拆箱操作之前,如果要讓基本類型像對(duì)象一樣操作,就要對(duì)基本類型進(jìn)行打包處理,Long、Integer、Double、Float、Boolean等類就是所謂的打包器(Wrapper)。
如:int num=10;
Integer wrapper=new Integer(num); //打包基本類型;
而在Java1.5版本增加了自動(dòng)裝箱與自動(dòng)拆箱的功能,也就是說現(xiàn)在像Integer num=10;現(xiàn)在實(shí)際做的事情就是Integer num=new Integer(10);
如: Integer wrapper=10; //自動(dòng)裝箱;
int num=wrapper; //自動(dòng)拆箱;
知道了什么是自動(dòng)裝箱和拆箱,我們?cè)賮砜纯闯绦蚴侨绾芜M(jìn)行自動(dòng)裝箱和拆箱的。
實(shí)際上對(duì)于Integer num=10;程序會(huì)將代碼展開為:Integer num=Integer.valueOf(100);
查看JDK可知valueOf()的操作內(nèi)容:
public static Integer valueOf(int i){
assert IntegerCache.high>=127;
if(i>=IntegerCache.low&&i<=IntegerCache.high)
return IntegerCache.cache[i+(-IntegerCache.low)];
return new Integer(i);
}
簡單來說就是如果傳入的int在IntegerCache.low和IntegerCache.high之間,就看看前面的緩存中有沒有打包過相同的值,有就直接返回,沒有的話就創(chuàng)建新的Integer實(shí)例。
之所以要將這個(gè)是為了引出使用“==”和“equals()”的問題,如下面的例子
Integer i1=200;
Integer i2=200; //200超過IntegerCache.high默認(rèn)值(127)
if(i1==i2){
System.out.println("i1==i2");
}
else{
System.out.println("i1!=i2");
}
編譯之后你會(huì)發(fā)現(xiàn)結(jié)果并不相等,所以別用==或!=來比較兩個(gè)對(duì)象實(shí)質(zhì)內(nèi)容值是否相等。
通過自動(dòng)裝箱與拆箱這個(gè)問題,wo體會(huì)到一方面是Java中對(duì)對(duì)象及其操作性的重要,另一方面是在學(xué)習(xí)Java的過程中要學(xué)會(huì)去看Java的一些原文檔,了解Java的實(shí)現(xiàn)原理,為的是知道Java可以用來實(shí)現(xiàn)什么和它不能做些什么。
java學(xué)習(xí)群669823128