Java提供了容納對(duì)象(或者對(duì)象的句柄)的多種方式,接下來(lái)我們具體看看都有哪些方式。
有兩方面的問(wèn)題將數(shù)組與其他集合類(lèi)型區(qū)分開(kāi)來(lái):效率和類(lèi)型。對(duì)于Java來(lái)說(shuō),為保存和訪問(wèn)一系列對(duì)象(實(shí)際是對(duì)象的句柄)數(shù)組,最有效的方法莫過(guò)于數(shù)組。數(shù)組實(shí)際代表一個(gè)簡(jiǎn)單的線性序列,它使得元素的訪問(wèn)速度非常快,但我們卻要為這種速度付出代價(jià):創(chuàng)建一個(gè)數(shù)組對(duì)象時(shí),它的大小是固定的,而且不可在那個(gè)數(shù)組對(duì)象的“存在時(shí)間”內(nèi)發(fā)生改變。可創(chuàng)建特定大小的一個(gè)數(shù)組,然后假如用光了存儲(chǔ)空間,就再創(chuàng)建一個(gè)新數(shù)組,將所有句柄從舊數(shù)組移到新數(shù)組。這屬于“矢量”(Vector)類(lèi)的行為。然而,由于為這種大小的靈活性要付出較大的代價(jià),所以我們認(rèn)為矢量的效率并沒(méi)有數(shù)組高。
在Java中,無(wú)論使用的是數(shù)組還是集合,都會(huì)進(jìn)行范圍檢查——若超過(guò)邊界,就會(huì)獲得一個(gè)RuntimeException(運(yùn)行期違例)錯(cuò)誤。幾種常見(jiàn)的集合類(lèi):Vector(矢量)、Stack(堆棧)以及Hashtable(散列表)。這些類(lèi)都涉及對(duì)對(duì)象的處理——好象它們沒(méi)有特定的類(lèi)型。換言之,它們將其當(dāng)作Object類(lèi)型處理(Object類(lèi)型是Java中所有類(lèi)的“根”類(lèi))。從某個(gè)角度看,這種處理方法是非常合理的:我們僅需構(gòu)建一個(gè)集合,然后任何Java對(duì)象都可以進(jìn)入那個(gè)集合(除基本數(shù)據(jù)類(lèi)型外——可用Java的基本類(lèi)型封裝類(lèi)將其作為常數(shù)置入集合,或者將其封裝到自己的類(lèi)內(nèi),作為可以變化的值使用)。這再一次反映了數(shù)組優(yōu)于常規(guī)集合:創(chuàng)建一個(gè)數(shù)組時(shí),可令其容納一種特定的類(lèi)型。
對(duì)象數(shù)組容納的是句柄,而基本數(shù)據(jù)類(lèi)型數(shù)組容納的是具體的數(shù)值。
1、集合
為容納一組對(duì)象,最適宜的選擇應(yīng)當(dāng)是數(shù)組。而且假如容納的是一系列基本數(shù)據(jù)類(lèi)型,更是必須采用數(shù)組。當(dāng)我們編寫(xiě)程序時(shí),通常并不能確切地知道最終需要多少個(gè)對(duì)象。有些時(shí)候甚至想用更復(fù)雜的方式來(lái)保存對(duì)象。為解決這個(gè)問(wèn)題,Java提供了四種類(lèi)型的“集合類(lèi)”:Vector(矢量)、BitSet(位集)、Stack(堆棧)以及Hashtable(散列表)。與擁有集合功能的其他語(yǔ)言相比,盡管這兒的數(shù)量顯得相當(dāng)少,但仍然能用它們解決數(shù)量驚人的實(shí)際問(wèn)題。
這些集合類(lèi)具有形形色色的特征。例如,Stack實(shí)現(xiàn)了一個(gè)LIFO(先入先出)序列,而Hashtable是一種“關(guān)聯(lián)數(shù)組”,允許我們將任何對(duì)象關(guān)聯(lián)起來(lái)。除此以外,所有Java集合類(lèi)都能自動(dòng)改變自身的大小。所以,我們?cè)诰幊虝r(shí)可使用數(shù)量眾多的對(duì)象,同時(shí)不必?fù)?dān)心會(huì)將集合弄得有多大。
1.1 缺點(diǎn):類(lèi)型未知
使用Java集合的“缺點(diǎn)”是在將對(duì)象置入一個(gè)集合時(shí)丟失了類(lèi)型信息。之所以會(huì)發(fā)生這種情況,是由于當(dāng)初編寫(xiě)集合時(shí),那個(gè)集合的程序員根本不知道用戶(hù)到底想把什么類(lèi)型置入集合。若指示某個(gè)集合只允許特定的類(lèi)型,會(huì)妨礙它成為一個(gè)“常規(guī)用途”的工具,為用戶(hù)帶來(lái)麻煩。為解決這個(gè)問(wèn)題,集合實(shí)際容納的是類(lèi)型為Object的一些對(duì)象的句柄。這種類(lèi)型當(dāng)然代表Java中的所有對(duì)象,因?yàn)樗撬蓄?lèi)的根。當(dāng)然,也要注意這并不包括基本數(shù)據(jù)類(lèi)型,因?yàn)樗鼈儾⒉皇菑摹叭魏螙|西”繼承來(lái)的。這是一個(gè)很好的方案,只是不適用下述場(chǎng)合:
(1) 將一個(gè)對(duì)象句柄置入集合時(shí),由于類(lèi)型信息會(huì)被拋棄,所以任何類(lèi)型的對(duì)象都可進(jìn)入我們的集合——即便特別指示它只能容納特定類(lèi)型的對(duì)象。舉個(gè)例子來(lái)說(shuō),雖然指示它只能容納貓,但事實(shí)上任何人都可以把一條狗扔進(jìn)來(lái)。
(2) 由于類(lèi)型信息不復(fù)存在,所以集合能肯定的唯一事情就是自己容納的是指向一個(gè)對(duì)象的句柄。正式使用它之前,必須對(duì)其進(jìn)行造型,使其具有正確的類(lèi)型。
2、Stack
Stack有時(shí)也可以稱(chēng)為“后入先出”(LIFO)集合。換言之,我們?cè)诙褩@镒詈蟆皦喝搿钡臇|西將是以后第一個(gè)“彈出”的。和其他所有Java集合一樣,我們壓入和彈出的都是“對(duì)象”,所以必須對(duì)自己彈出的東西進(jìn)行“造型”。
一種很少見(jiàn)的做法是拒絕使用Vector作為一個(gè)Stack的基本構(gòu)成元素,而是從Vector里“繼承”一個(gè)Stack。這樣一來(lái),它就擁有了一個(gè)Vector的所有特征及行為,另外加上一些額外的Stack行為。很難判斷出設(shè)計(jì)者到底是明確想這樣做,還是屬于一種固有的設(shè)計(jì)。
下面是一個(gè)簡(jiǎn)單的堆棧示例,它能讀入數(shù)組的每一行,同時(shí)將其作為字串壓入堆棧。
import java.util.*; public class Stacks { static String[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; public static void main(String[] args) { Stack stk = new Stack(); for(int i = 0; i < months.length; i++) stk.push(months[i] + " "); System.out.println("stk = " + stk); // Treating a stack as a Vector: stk.addElement("The last line"); System.out.println( "element 5 = " + stk.elementAt(5)); System.out.println("popping elements:"); while(!stk.empty()) System.out.println(stk.pop()); } }
新聞名稱(chēng):Java編程思想對(duì)象的容納實(shí)例詳解-創(chuàng)新互聯(lián)
標(biāo)題URL:http://chinadenli.net/article22/ehscc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航、服務(wù)器托管、網(wǎng)站內(nèi)鏈、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容