?
管中窺虎
在學(xué)習(xí)java 1.5的過程中,我使用了sun公布的tutorial,這份文檔寫的比較詳盡易明,但是對于想快速了解tiger而且具有較好java基礎(chǔ)的人來說,大篇幅的英文文檔是比較耗時(shí)間和非必需的,所以我將會(huì)歸納這份文檔的主要內(nèi)容,在保證理解的底線上,盡力減少閱讀者需要的時(shí)間。
?
在以下地址可以進(jìn)入各新增語言特色介紹以及下載相關(guān)文檔(若有)。
http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html
?
?
2006年8月15日星期二
第三道虎紋:自動(dòng)包裝機(jī)制
?
我們知道容器類不能放基本類型的,放進(jìn)放出都要先包裝和解包,所有的這些工作都是繁瑣而無聊的,它早就該有自動(dòng)機(jī)制了,終于在
1.5
里得到了實(shí)現(xiàn)。
?
import
?java.util.
*
;

?

//
?Prints?a?frequency?table?of?the?words?on?the?command?line
public
?
class
?Frequency?
{


???
public
?
static
?
void
?main(String[]?args)?
{

??????Map
<
String,?Integer
>
?m?
=
?
new
?TreeMap
<
String,?Integer
>
();


??????
for
?(String?word?:?args)?
{

??????????Integer?freq?
=
?m.get(word);

??????????m.put(word,?(freq?
==
?
null
?
?
?
1
?:?freq?
+
?
1
));

??????}
??????System.out.println(m);

???}
}
java Frequency if it is to be it is up to me to do the watusi
{be=1, do=1, if=1, is=2, it=2, me=1, the=1, to=3, up=1, watusi=1}
?
注意到
freq
如果為空,那么
put
的第二個(gè)參數(shù)就是
int
類型的
1
,這個(gè)時(shí)候就出現(xiàn)了自動(dòng)的包裝,而如果
freq
不為空,那么
freq
+
1
就是自動(dòng)解包后運(yùn)算,再自動(dòng)包裝,放入
Map
中。
現(xiàn)在你基本上可以忽略
Integer
和
int
(或者這一類的對應(yīng))之間的區(qū)別了,除了要注意幾點(diǎn)警告:
Integer
是可以為
null
的,如果程序試圖自動(dòng)解包一個(gè)
null
,會(huì)拋出
NullPointerException
。
==用于
Integer
時(shí)比的是引用,用于
int
的時(shí)候比的是值。最后,還有一點(diǎn)就是即使現(xiàn)在是自動(dòng)解包打包,它們的運(yùn)行損耗并沒消失,你依然為這些動(dòng)作付出了
cpu
的計(jì)算時(shí)間。
?
這里還有一個(gè)相關(guān)的例子:
//
?List?adapter?for?primitive?int?array
public
?
static
?List
<
Integer
>
?asList(
final
?
int
[]?a)?
{


????
return
?
new
?AbstractList
<
Integer
>
()?
{


????????
public
?Integer?get(
int
?i)?
{?
return
?a[i];?}
????????
//
?Throws?NullPointerException?if?val?==?null
????????
public
?Integer?set(
int
?i,?Integer?val)?
{

????????????Integer?oldVal?
=
?a[i];

????????????a[i]?
=
?val;

????????????
return
?oldVal;

????????}
????????
public
?
int
?size()?
{?
return
?a.length;?}
????}
;

}
?
通過自動(dòng)的包裝機(jī)制,提供了數(shù)組與
List
的靈活轉(zhuǎn)換,但是它的運(yùn)行效率是比較低的,每個(gè)
get
,
set
操作,都進(jìn)行了解包或者打包,偶爾使用這個(gè)方法還湊合,如果是用于核心代碼的循環(huán)里,那就是夠傻的了。
?
那我們什么時(shí)候該用自動(dòng)的包裝機(jī)制呢?僅僅是用于消除這類所謂的“阻抗不匹配”,就是基本類型與包裝類的差異,例如要把數(shù)值放入容器類的時(shí)候。如果在進(jìn)行科學(xué)計(jì)算的代碼或者其他講究效率的代碼中使用,則是不恰當(dāng)?shù)摹R粋€(gè)
Integer
不是一個(gè)
int
,自動(dòng)包裝機(jī)制僅僅模糊了它們的區(qū)別,而沒有消除之。