array(數(shù)組)和Vector是十分相似的Java構(gòu)件(constructs),兩者全然不同,在選擇使用時(shí)應(yīng)根據(jù)各自的功能來(lái)確定。
1、數(shù)組:Java arrays的元素個(gè)數(shù)不能下標(biāo)越界,從很大程度上保證了Java程序的安全性,而其他一些語(yǔ)言出現(xiàn)這一問(wèn)題時(shí)常導(dǎo)致災(zāi)難性的后果。
??????? Array可以存放Object和基本數(shù)據(jù)類型,但創(chuàng)建時(shí)必須指定數(shù)組的大小,并不能再改變。值得注意的是:當(dāng)Array中的某一元素存放的是Objrct reference?時(shí),Java不會(huì)調(diào)用默認(rèn)的構(gòu)造函數(shù),而是將其初值設(shè)為null,當(dāng)然這跟Java對(duì)各類型數(shù)據(jù)賦默認(rèn)值的規(guī)則是一樣的,對(duì)基本數(shù)據(jù)類型同樣適用。
2、Vector:對(duì)比于Array,當(dāng)更多的元素被加入進(jìn)來(lái)以至超出其容量時(shí),Vector的size會(huì)動(dòng)態(tài)增長(zhǎng),而Array容量是定死的。同時(shí),Vector在刪除一些元素后,其所有下標(biāo)大于被刪除元素的元素都依次前移,并獲得新下標(biāo)比原來(lái)的小了)。注意:當(dāng)調(diào)用Vector的size()方法時(shí),返回Vector中實(shí)際元素的個(gè)數(shù)。
???? Vector內(nèi)部實(shí)際是以Array實(shí)現(xiàn)的,也通過(guò)元素的整數(shù)索引來(lái)訪問(wèn)元素,但它只能存放java.lang.Object對(duì)象,不能用于存放基本類型數(shù)據(jù),比如要存放一個(gè)整數(shù)10,得用new Integer(10)構(gòu)造出一個(gè)Integer包裝類對(duì)象再放進(jìn)去。當(dāng)Vector中的元素個(gè)數(shù)發(fā)生變化時(shí), 其內(nèi)部的Array必須重新分配并進(jìn)行拷貝,因此這是一點(diǎn)值得考慮的效率問(wèn)題。
???? Vetor同時(shí)也實(shí)現(xiàn)了List接口,所以也可以算作Colletion了,只是它還特殊在:Vector is synchronized。即Vetor對(duì)象自身實(shí)現(xiàn)了同步機(jī)制。
3、ArrayList:實(shí)現(xiàn)了List接口,功能與Vetor一樣,只是沒(méi)有同步機(jī)制,當(dāng)然元素的訪問(wèn)方式為從List中繼承而來(lái),可存放任何類型的對(duì)象。
4、HashMap:繼承了Map接口,實(shí)現(xiàn)用Keys來(lái)存儲(chǔ)和訪問(wèn)Values,Keys和Values都可以為空,它與Hashtable類的區(qū)別在于Hashtable類的Keys不能為null,并Hashtable類有同步機(jī)制控制,而HashMap類沒(méi)有。
????? 在Struts類庫(kù)中實(shí)現(xiàn)了一個(gè)LableValueBean,用Lable(Key)來(lái)存儲(chǔ)和訪問(wèn)Value,很方便。