Java提供了容納對象(或者對象的句柄)的多種方式,接下來我們具體看看都有哪些方式。
創(chuàng)新互聯(lián)公司,是成都地區(qū)的互聯(lián)網(wǎng)解決方案提供商,用心服務為企業(yè)提供網(wǎng)站建設、重慶APP軟件開發(fā)、重慶小程序開發(fā)公司、系統(tǒng)按需定制網(wǎng)站和微信代運營服務。經(jīng)過數(shù)10余年的沉淀與積累,沉淀的是技術和服務,讓客戶少走彎路,踏實做事,誠實做人,用情服務,致力做一個負責任、受尊敬的企業(yè)。對客戶負責,就是對自己負責,對企業(yè)負責。有兩方面的問題將數(shù)組與其他集合類型區(qū)分開來:效率和類型。對于Java來說,為保存和訪問一系列對象(實際是對象的句柄)數(shù)組,最有效的方法莫過于數(shù)組。數(shù)組實際代表一個簡單的線性序列,它使得元素的訪問速度非???,但我們卻要為這種速度付出代價:創(chuàng)建一個數(shù)組對象時,它的大小是固定的,而且不可在那個數(shù)組對象的“存在時間”內(nèi)發(fā)生改變??蓜?chuàng)建特定大小的一個數(shù)組,然后假如用光了存儲空間,就再創(chuàng)建一個新數(shù)組,將所有句柄從舊數(shù)組移到新數(shù)組。這屬于“矢量”(Vector)類的行為。然而,由于為這種大小的靈活性要付出較大的代價,所以我們認為矢量的效率并沒有數(shù)組高。
在Java中,無論使用的是數(shù)組還是集合,都會進行范圍檢查——若超過邊界,就會獲得一個RuntimeException(運行期違例)錯誤。幾種常見的集合類:Vector(矢量)、Stack(堆棧)以及Hashtable(散列表)。這些類都涉及對對象的處理——好象它們沒有特定的類型。換言之,它們將其當作Object類型處理(Object類型是Java中所有類的“根”類)。從某個角度看,這種處理方法是非常合理的:我們僅需構(gòu)建一個集合,然后任何Java對象都可以進入那個集合(除基本數(shù)據(jù)類型外——可用Java的基本類型封裝類將其作為常數(shù)置入集合,或者將其封裝到自己的類內(nèi),作為可以變化的值使用)。這再一次反映了數(shù)組優(yōu)于常規(guī)集合:創(chuàng)建一個數(shù)組時,可令其容納一種特定的類型。
對象數(shù)組容納的是句柄,而基本數(shù)據(jù)類型數(shù)組容納的是具體的數(shù)值。
1、集合
為容納一組對象,最適宜的選擇應當是數(shù)組。而且假如容納的是一系列基本數(shù)據(jù)類型,更是必須采用數(shù)組。當我們編寫程序時,通常并不能確切地知道最終需要多少個對象。有些時候甚至想用更復雜的方式來保存對象。為解決這個問題,Java提供了四種類型的“集合類”:Vector(矢量)、BitSet(位集)、Stack(堆棧)以及Hashtable(散列表)。與擁有集合功能的其他語言相比,盡管這兒的數(shù)量顯得相當少,但仍然能用它們解決數(shù)量驚人的實際問題。
這些集合類具有形形色色的特征。例如,Stack實現(xiàn)了一個LIFO(先入先出)序列,而Hashtable是一種“關聯(lián)數(shù)組”,允許我們將任何對象關聯(lián)起來。除此以外,所有Java集合類都能自動改變自身的大小。所以,我們在編程時可使用數(shù)量眾多的對象,同時不必擔心會將集合弄得有多大。
1.1 缺點:類型未知
使用Java集合的“缺點”是在將對象置入一個集合時丟失了類型信息。之所以會發(fā)生這種情況,是由于當初編寫集合時,那個集合的程序員根本不知道用戶到底想把什么類型置入集合。若指示某個集合只允許特定的類型,會妨礙它成為一個“常規(guī)用途”的工具,為用戶帶來麻煩。為解決這個問題,集合實際容納的是類型為Object的一些對象的句柄。這種類型當然代表Java中的所有對象,因為它是所有類的根。當然,也要注意這并不包括基本數(shù)據(jù)類型,因為它們并不是從“任何東西”繼承來的。這是一個很好的方案,只是不適用下述場合:
(1) 將一個對象句柄置入集合時,由于類型信息會被拋棄,所以任何類型的對象都可進入我們的集合——即便特別指示它只能容納特定類型的對象。舉個例子來說,雖然指示它只能容納貓,但事實上任何人都可以把一條狗扔進來。
(2) 由于類型信息不復存在,所以集合能肯定的唯一事情就是自己容納的是指向一個對象的句柄。正式使用它之前,必須對其進行造型,使其具有正確的類型。
2、Stack
Stack有時也可以稱為“后入先出”(LIFO)集合。換言之,我們在堆棧里最后“壓入”的東西將是以后第一個“彈出”的。和其他所有Java集合一樣,我們壓入和彈出的都是“對象”,所以必須對自己彈出的東西進行“造型”。
一種很少見的做法是拒絕使用Vector作為一個Stack的基本構(gòu)成元素,而是從Vector里“繼承”一個Stack。這樣一來,它就擁有了一個Vector的所有特征及行為,另外加上一些額外的Stack行為。很難判斷出設計者到底是明確想這樣做,還是屬于一種固有的設計。
下面是一個簡單的堆棧示例,它能讀入數(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()); } }
新聞名稱:Java編程思想對象的容納實例詳解-創(chuàng)新互聯(lián)
標題URL:http://www.rwnh.cn/article22/ehscc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、手機網(wǎng)站建設、面包屑導航、服務器托管、網(wǎng)站內(nèi)鏈、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容