計(jì)算機(jī)學(xué)習(xí)大全_第1頁(yè)
計(jì)算機(jī)學(xué)習(xí)大全_第2頁(yè)
計(jì)算機(jī)學(xué)習(xí)大全_第3頁(yè)
計(jì)算機(jī)學(xué)習(xí)大全_第4頁(yè)
計(jì)算機(jī)學(xué)習(xí)大全_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JAVA基礎(chǔ)題庫(kù)1、作用域public,private,protected,以及不寫(xiě)時(shí)的區(qū)別注:不寫(xiě)時(shí)關(guān)鍵字默認(rèn)為friendly作用域當(dāng)前類同一package子孫類其他packagepublicqq7qprotected7qqXfriendly74XXprivateqXXX2,AnonymousInnerClass(匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)答:匿名的內(nèi)部類是沒(méi)有名字的內(nèi)部類。不能extends(繼承)其它類,但一個(gè)內(nèi)部類可以作為一個(gè)接口,由另一個(gè)內(nèi)部類實(shí)現(xiàn)3、&和&&的區(qū)別。答:&和&&都可以用作邏輯與的運(yùn)算符,表示邏輯與(and),當(dāng)運(yùn)算符兩邊的表達(dá)式的結(jié)果都為true時(shí),整個(gè)運(yùn)算結(jié)果才為true,否則,只要有一方為false,則結(jié)果為false。&&還具有短路的功能,即如果第一個(gè)表達(dá)式為false,則不再計(jì)算第二個(gè)表達(dá)式,例如,對(duì)于if(str!=null&&!str.equals(""))表達(dá)式,當(dāng)str為null時(shí),后面的表達(dá)式不會(huì)執(zhí)行,所以不會(huì)出現(xiàn)NullPointerException如果將&&改為&,則會(huì)拋出NullPointerException異常。If(x==33&++y>0)y會(huì)增長(zhǎng),If(x==33&&++y〉0)不會(huì)增長(zhǎng)&還可以用作位運(yùn)算符,當(dāng)&操作符兩邊的表達(dá)式不是boolean類型時(shí),&表示按位與操作,我們通常使用OxOf來(lái)與一個(gè)整數(shù)進(jìn)行&運(yùn)算,來(lái)獲取該整數(shù)的最低4個(gè)bit位,例如,0x31&OxOf的結(jié)果為0x01o4、StaticNestedClass和InnerClass的不同NestedClass一般是C++的說(shuō)法,InnerClass一般是JAVA的說(shuō)法。Nestedclass分為靜態(tài)Staticnestedclass的和非靜態(tài)的innerclass,靜態(tài)的Staticnestedclass是不可以直接調(diào)用它的外部類enclosingclass的,但是可以通過(guò)外部類的引用來(lái)調(diào)用,就像你在一個(gè)類中寫(xiě)了main方法一樣。非靜態(tài)類innerclass可以自由的引用外部類的屬性和方法,但是它與一個(gè)實(shí)例綁定在了以其,不可以定義靜態(tài)的屬性、方法。InnerClass(內(nèi)部類)定義在類中的類。NestedClass(嵌套類)是靜態(tài)(static)內(nèi)部類。1.要?jiǎng)?chuàng)建嵌套類的對(duì)象,并不需要其外圍類的對(duì)象。2.不能從嵌套類的對(duì)象中訪問(wèn)非靜態(tài)的外圍類對(duì)象。AnonymousInnerClass(匿名內(nèi)部類)匿名的內(nèi)部類是沒(méi)有名字的內(nèi)部類。匿名的內(nèi)部類不能extends(繼承)其它類,但一個(gè)內(nèi)部類可以作為一個(gè)接口,由另一個(gè)內(nèi)部類實(shí)現(xiàn)。嵌套類可以作為接口的內(nèi)部類。正常情況下,你不能在接口內(nèi)部放置任何代碼,但嵌套類可以作為接口的一部分,因?yàn)樗莝tatic的。只是將嵌套類置于接口的命名空間內(nèi),這并不違反接口的規(guī)則。靜態(tài)方法是不能繼承的,因?yàn)樗庆o態(tài)的,所謂靜態(tài)當(dāng)然是時(shí)間和空間的靜止嘍……所以任何人都別想改變他。但是它不介意有人和它叫一樣的名字,所以子類是可以cover的,但是其實(shí)這樣會(huì)出來(lái)兩個(gè)函數(shù),一個(gè)父類的一個(gè)子類的,各管各的。然后final是java里面定義的,不能被重載的函數(shù)。java里面的函數(shù)如果沒(méi)有特別標(biāo)識(shí),只要在子類中定義了一個(gè)同名的函數(shù),那么父類的函數(shù)就被重裁掉了。如果new一個(gè)子類的對(duì)象給父類再調(diào)用這個(gè)函數(shù),就是調(diào)用子類的了。只有new的是父類的調(diào)的才是父類的。java里面沒(méi)有virtual的說(shuō)法,因?yàn)椴皇莊inal或static就是virtual的。abstract是虛函數(shù),自然不可能是final的,同時(shí)如上所說(shuō),static是不能被重載只能被覆蓋的,所以也不可以是abstract的內(nèi)部類被繼承,由于內(nèi)部類有一個(gè)指向外圍類對(duì)象的秘密引用,所以在繼承內(nèi)部類的時(shí)候,該秘密引用必須被初始化。解決方法是enclosingClassReference.super();語(yǔ)法,看一下代碼:classOuter...(classInner...(}}classAnoClassextendsOuter.Inner...(AnoClass(Outerwi)...{wi.super();匿名類(AnonymousClass)當(dāng)一個(gè)內(nèi)部類的類聲名只是在創(chuàng)建此類對(duì)象時(shí)用了一次,而且要產(chǎn)生的新類需繼承于一個(gè)已有的父類或?qū)崿F(xiàn)一個(gè)接口,才能考慮用匿名類,由于匿名類木身無(wú)名,因此它也就不存在構(gòu)造方法,它需要顯示地調(diào)用一個(gè)無(wú)參的父類的構(gòu)造方法,并且重寫(xiě)父類的方法。f.addMouseMotionListener(newMouseMotionAdapter(){〃匿名類開(kāi)始publicvoidmouseDragged(MouseEvente){Strings=*Mousedragging:x="+e.getX()+"Y="+e.getY();tf.setText(s);}});〃匿名類結(jié)束存在它的原因是:.一個(gè)內(nèi)部類的對(duì)象能夠訪問(wèn)創(chuàng)建它的對(duì)象的實(shí)現(xiàn),包括私有數(shù)據(jù)。即內(nèi)部類實(shí)例對(duì)包含它的哪個(gè)類的實(shí)例來(lái)說(shuō),是特權(quán)的。.對(duì)于同一個(gè)包中的其他類來(lái)說(shuō),內(nèi)部類能夠隱藏起來(lái),換句話說(shuō),內(nèi)部類不管方法的可見(jiàn)性如何,那怕是public,除了包容類,其他類都無(wú)法使用它。.匿名內(nèi)部類可以很方便的定義回調(diào)。.使用內(nèi)部類可以非常方便的編寫(xiě)事件驅(qū)動(dòng)程序。其實(shí)它真正的目的僅僅為了定義回調(diào)一一進(jìn)步就是事件驅(qū)動(dòng)。在使用匿名內(nèi)部類時(shí),要記住以下幾個(gè)原則:匿名內(nèi)部類不能有構(gòu)造方法。匿名內(nèi)部類不能定義任何靜態(tài)成員、方法和類。,匿名內(nèi)部類不能是public,protected,private,static?只能創(chuàng)建匿名內(nèi)部類的一個(gè)實(shí)例。?一個(gè)匿名內(nèi)部類一定是在new的后面,用其隱含實(shí)現(xiàn)一個(gè)接口或?qū)崿F(xiàn)一個(gè)類。?因匿名內(nèi)部類為局部?jī)?nèi)部類,所以局部?jī)?nèi)部類的所有限制都對(duì)其生效。匿名類和內(nèi)部類中的中的this:有時(shí)候,我們會(huì)用到一些內(nèi)部類和匿名類。當(dāng)在匿名類中用this時(shí),這個(gè)this則指的是匿名類或內(nèi)部類本身。這時(shí)如果我們要使用外部類的方法和變量的話,則應(yīng)該加上外部類的類名。5、ASCII,unicode和UTF-8,UTF-16,gbk,gb2312的區(qū)另4與不同。ASCII(AmericanStandardCodeforInformationInterchange)碼,是一種字符集。美國(guó)標(biāo)準(zhǔn)信息交換代碼是由美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)(AmericanNationalStandardInstitute,ANSI)制定的,標(biāo)準(zhǔn)的單字節(jié)字符編碼方案,用于基于文本的數(shù)據(jù)。起始于50年代后期,在1967年定案。它最初是美國(guó)國(guó)家標(biāo)準(zhǔn),供不同計(jì)算機(jī)在相互通信時(shí)用作共同遵守的西文字符編碼標(biāo)準(zhǔn),它已被國(guó)際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,ISO)定為國(guó)際標(biāo)準(zhǔn),稱為ISO646標(biāo)準(zhǔn)。適用于所有拉丁文字字母。ASCII碼使用指定的7位或8位二進(jìn)制數(shù)組合來(lái)表示128或256種可能的字符。標(biāo)準(zhǔn)ASCII碼也叫基礎(chǔ)ASCII碼,使用7位二進(jìn)制數(shù)來(lái)表示所有的大寫(xiě)和小寫(xiě)字母,數(shù)字0到9、標(biāo)點(diǎn)符號(hào),以及在美式英語(yǔ)中使用的特殊控制字符。其中:0?31及127(共33個(gè))是控制字符或通訊專用字符(其余為可顯示字符),如控制符:LF(換行)、CR(回車)、FF(換頁(yè))、DEL(刪除)、BS(退格)、BEL(振鈴)等:通訊專用字符:SOH(文頭)、EOT(文尾)、ACK(確認(rèn))等;ASCII值為8、9、10和13分別轉(zhuǎn)換為退格、制表、換行和回車字符。它們并沒(méi)有特定的圖形顯示,但會(huì)依不同的應(yīng)用程序,而對(duì)文本顯示有不同的影響。32?126(共95個(gè))是字符(32sp是空格),其中48?57為0到9十個(gè)阿拉伯?dāng)?shù)字;65?90為26個(gè)大寫(xiě)英文字母,97?122號(hào)為26個(gè)小寫(xiě)英文字母,其余為一些標(biāo)點(diǎn)符號(hào)、運(yùn)算符號(hào)等。同時(shí)還要注意,在標(biāo)準(zhǔn)ASCH中,其最高位(b7)用作奇偶校驗(yàn)位。所謂奇偶校驗(yàn),是指在代碼傳送過(guò)程中用來(lái)檢驗(yàn)是否出現(xiàn)錯(cuò)誤的一種方法,一般分奇校驗(yàn)和偶校驗(yàn)兩種。奇校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是奇數(shù),若非奇數(shù),則在最高位b7添1;偶校驗(yàn)規(guī)定:正確的代碼一個(gè)字節(jié)中1的個(gè)數(shù)必須是偶數(shù),若非偶數(shù),則在最高位b7添1。UNICODE(UniversalMultiple-OctetCodedCharacterSet)字符集Unicode(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼)是一種在計(jì)算機(jī)上使用的字符編碼。它為每種語(yǔ)言中的每個(gè)字符設(shè)定了統(tǒng)一并且唯一的二進(jìn)制編碼,以滿足跨語(yǔ)言、跨平臺(tái)進(jìn)行文本轉(zhuǎn)換、處理的要求。unicode有兩種方式:UCS-2,UCS-4,顧名思義,是兩個(gè)字節(jié)和4個(gè)字節(jié)。具體的可以google和百度??偟膩?lái)講,計(jì)算機(jī)前期,一般是ASCII,現(xiàn)在基于全球一體化,基木都用unicode。字符編碼.Gbk,GB2312,GB18030字符必須編碼后才能被計(jì)算機(jī)處理。計(jì)算機(jī)使用的缺省編碼方式就是計(jì)算機(jī)的內(nèi)碼。早期的計(jì)算機(jī)使用7位的ASCII編碼,為了處理漢字,程序員設(shè)計(jì)了用于簡(jiǎn)體中文的GB2312和用于繁體中文的big51,GB2312(1980年)一共收錄了7445個(gè)字符,包括6763個(gè)漢字和682個(gè)其它符號(hào)。漢字區(qū)的內(nèi)碼范圍高字節(jié)從B0-F7,低字節(jié)從A1-FE,占用的碼位是72*94=6768。其中有5個(gè)空位是D7FA-D7FE。GB2312支持的漢字太少。1995年的漢字?jǐn)U展規(guī)范GBKL0收錄了21886個(gè)符號(hào),它分為漢字區(qū)和圖形符號(hào)區(qū)。漢字區(qū)包括21003個(gè)字符。2000年的GB18030是取代GBK1.0的正式國(guó)家標(biāo)準(zhǔn)。該標(biāo)準(zhǔn)收錄了27484個(gè)漢字,同時(shí)還收錄了藏文、蒙文、維吾爾文等主要的少數(shù)民族文字。現(xiàn)在的PC平臺(tái)必須支持GB18030,對(duì)嵌入式產(chǎn)品暫不作要求。所以手機(jī)、MP3一般只支持GB2312。從ASCII、GB2312,GBK到GB18030,這些編碼方法是向下兼容的,即同一個(gè)字符在這些方案中總是有相同的編碼,后面的標(biāo)準(zhǔn)支持更多的字符。在這些編碼中,英文和中文可以統(tǒng)一地處理。區(qū)分中文編碼的方法是高字節(jié)的最高位不為0。按照程序員的稱呼,GB2312、GBK到GB18030都屬于雙字節(jié)字符集(DBCS)。GB18030是中國(guó)所有非手持/嵌入式計(jì)算機(jī)系統(tǒng)的強(qiáng)制實(shí)施標(biāo)準(zhǔn)..UTF-8,UTF-16,UTF-32UTF-8,8bit編碼,ASCII不作變換,其他字符做變長(zhǎng)編碼,每個(gè)字符1-3byte.通常作為外碼.有以下優(yōu)點(diǎn):*與CPU字節(jié)順序無(wú)關(guān),可以在不同平臺(tái)之間交流*容錯(cuò)能力高,任何一個(gè)字節(jié)損壞后,最多只會(huì)導(dǎo)致一個(gè)編碼碼位損失,不會(huì)鏈鎖錯(cuò)誤(如GB碼錯(cuò)一個(gè)字節(jié)就會(huì)整行亂碼)UTF-16,16bit編碼,是變長(zhǎng)碼,大致相當(dāng)于20位編碼,值在。到OxlOFFFF之間,基本上就是Unicode編碼的實(shí)現(xiàn).它是變長(zhǎng)碼,與CPU字序有關(guān),但因?yàn)樽钍】臻g,常作為網(wǎng)絡(luò)傳輸?shù)耐獯a.UTF-16是unicode的preferredencoding.UTF-32,僅使用了unicode范圍(0到OxlOFFFF)的32位編碼,相當(dāng)于UCS-4的子集.14、給我一個(gè)你最常見(jiàn)到的runtimeexception答:常見(jiàn)的運(yùn)行時(shí)異常有如下這些ArithmeticException,ArrayStoreException,BufferOverf1owException,BufferUnderflowException,CannotRedoException,CannotUndoException,ClassCastException,CMMException,ConcurrentModificationException,DOMException,EmptyStackException,IllegalArgumentException,IllegalMonitorStateException,IllegalPathStateException,I1legalStateException,ImagingOpException,IndexOutOfBoundsException,MissingResourceException,NegativeArraySizeException,NoSuchElementException,NullPointerException,ProfileDataException,ProviderException,RasterFormatException,SecurityException, SystemException, Undec1aredThrowab1eException,UnmodifiableSetException,UnsupportedOperationException5、Collection和Collections的區(qū)別答:Collection是集合類的上級(jí)接口,繼承與他的接口主要有Set和List.Collections是針對(duì)集合類的一個(gè)幫助類,他提供一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程安全化等操作15、error和exception有什么區(qū)別答:error表示恢復(fù)不是不可能但很困難的情況下的一種嚴(yán)重問(wèn)題。比如說(shuō)內(nèi)存溢出。不可能指望程序能處理這樣的情況exception表示一種設(shè)計(jì)或?qū)崿F(xiàn)問(wèn)題。也就是說(shuō),它表示如果程序運(yùn)行正常,從不會(huì)發(fā)生的情況16、List,Set,Map是否繼承自Collection接口答:List,Set是,Map不是17、abstractclass和interface有什么區(qū)別答:聲明方法的存在而不去實(shí)現(xiàn)它的類被叫做抽象類(abstractclass),它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在該類中實(shí)現(xiàn)該類的情況。不能創(chuàng)建abstract類的實(shí)例。然而可以創(chuàng)建一個(gè)變量,其類型是一個(gè)抽象類,并讓它指向具體子類的一個(gè)實(shí)例。不能有抽象構(gòu)造函數(shù)或抽象靜態(tài)方法。Abstract類的子類為它們父類中的所有抽象方法提供實(shí)現(xiàn),否則它們也是抽象類為。取而代之,在子類中實(shí)現(xiàn)該方法。知道其行為的其它類可以在類中實(shí)現(xiàn)這些方法接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過(guò)實(shí)現(xiàn)這樣的接口而獲得。接口中的所有方法都是抽象的,沒(méi)有一個(gè)有程序體?接口只可以定義staticfinal成員變量。接口的實(shí)現(xiàn)與子類相似,除了該實(shí)現(xiàn)類不能從接口定義中繼承行為。當(dāng)類實(shí)現(xiàn)特殊接口時(shí),它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實(shí)現(xiàn)了該接口的類的任何對(duì)象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動(dòng)態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)換,instanceof運(yùn)算符可以用來(lái)決定某對(duì)象的類是否實(shí)現(xiàn)了接口6、Java基本概念:集合類List/Set/Map…的區(qū)別和聯(lián)系Collection:List、SetMap:HashMap、HashTable如何在它們之間選擇一、Array,ArraysJava所有“存儲(chǔ)及隨機(jī)訪問(wèn)一連串對(duì)象”的做法,array是最有效率的一種。效率高,但容量固定且無(wú)法動(dòng)態(tài)改變。array還有一個(gè)缺點(diǎn)是,無(wú)法判斷其中實(shí)際存有多少元素,length只是告訴我們array的容量。2、Java中有一個(gè)Arrays類,專門(mén)用來(lái)操作arrayoarrays中擁有一組static函數(shù),equals():比較兩個(gè)array是否相等。array擁有相同元素個(gè)數(shù),且所有對(duì)應(yīng)元素兩兩相等。將值填入array中。sort():用來(lái)對(duì)array進(jìn)行排序。binarySearch():在排好序的array中尋找元素。System.arraycopy():array的復(fù)制。二、Collection,Map若撰寫(xiě)程序時(shí)不知道究竟需要多少對(duì)象,需要在空間不足時(shí)自動(dòng)擴(kuò)增容量,則需要使用容器類庫(kù),array不適用。1、Collection和Map的區(qū)別容器內(nèi)每個(gè)為之所存儲(chǔ)的元素個(gè)數(shù)不同。Collection類型者,每個(gè)位置只有一個(gè)元素。M叩類型者,持有key?valuepair,像個(gè)小型數(shù)據(jù)庫(kù)。2、各自旗下的子類關(guān)系Collection-List:將以特定次序存儲(chǔ)元素。所以取出來(lái)的順序可能和放入順序不同。—ArrayList/LinkedListVector-Set:不能含有重復(fù)的元素—HashSet/TreeSetMap-HashMap-HashTable-TreeMapCollection-ListpLinkcdList-ArrayList1-Vectorl-StackLSetM叩-Hashtablc-HashMapLWcakHashM叩Collection接口Collection是最基本的集合接口,一個(gè)Collection代表一組Object,即Collection的元素(Elements)o一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接繼承自Collection的類,JavaSDK提供的類都是繼承自Collection的“子接口''如List和Seto所有實(shí)現(xiàn)Collection接口的類都必須提供兩個(gè)標(biāo)準(zhǔn)的構(gòu)造函數(shù):無(wú)參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)空的Collection,有一個(gè)Collection參數(shù)的構(gòu)造函數(shù)用于創(chuàng)建一個(gè)新的Collection,這個(gè)新的Collection與傳入的Collection有相同的元素。后一個(gè)構(gòu)造函數(shù)允許用戶復(fù)制一個(gè)Collectiono如何遍歷Collection中的每一個(gè)元素?不論Collection的實(shí)際類型如何,它都支持一個(gè)iterator。的方法,該方法返回一個(gè)迭代子,使用該迭代子即可逐一訪問(wèn)Collection中每一個(gè)元素。典型的用法如下:Iteratorit=collection.iterator();//獲得一個(gè)迭代子while(it.hasNext()){Objectobj=it.next();//得到下一個(gè)元素)由Collection接口派生的兩個(gè)接口是List和Set。List接口List是有序的Collection,使用此接口能夠精確的控制每個(gè)元素插入的位置。用戶能夠使用索引(元素在List中的位置,類似于數(shù)組下標(biāo))來(lái)訪問(wèn)List中的元素,這類似于Java的數(shù)組。和下面要提到的Set不同,List允許有相同的元素。除了具有Collection接口必備的iterator()方法外,List還提供一個(gè)listlterator()方法,返回一個(gè)Listiterator接口,和標(biāo)準(zhǔn)的Iterator接口相比,Listiterator多了一些add()之類的方法,允許添加,刪除,設(shè)定元素,還能向前或向后遍歷。實(shí)現(xiàn)List接口的常用類有LinkedList?ArrayList,Vector和StackoLinkedList類LinkedList實(shí)現(xiàn)了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊(duì)列(queue)或雙向隊(duì)列(deque)。注意LinkedList沒(méi)有同步方法。如果多個(gè)線程同時(shí)訪問(wèn)一個(gè)List,則必須自己實(shí)現(xiàn)訪問(wèn)同步。一種解決方法是在創(chuàng)建List時(shí)構(gòu)造一個(gè)同步的List:Listlist=Collections.synchronizedList(newLinkedList(...));ArrayList類ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括nulLArrayList沒(méi)有同步。size,isEmpty,get,set方法運(yùn)行時(shí)間為常數(shù)。但是add方法開(kāi)銷為分?jǐn)偟某?shù),添加n個(gè)元素需要O(n)的時(shí)間。其他的方法運(yùn)行時(shí)間為線性。每個(gè)ArrayList實(shí)例都有一個(gè)容量(Capacity),即用于存儲(chǔ)元素的數(shù)組的大小。這個(gè)容量可隨著不斷添加新元素而自動(dòng)增加,但是增長(zhǎng)算法并沒(méi)有定義。當(dāng)需要插入大量元素時(shí),在插入前可以調(diào)用ensureCapacity方法來(lái)增加ArrayList的容量以提高插入效率。和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。Vector類Vector非常類似ArrayList,但是Vector是同步的。由Vector創(chuàng)建的Iterator9雖然和ArrayList創(chuàng)建的Iterator是同一接口,但是,因?yàn)閂ector是同步的,當(dāng)一個(gè)Iterator被創(chuàng)建而且正在被使用,另一個(gè)線程改變了Vector的狀態(tài)(例如,添加或刪除了一些元素),這時(shí)調(diào)用Iterator的方法時(shí)將拋出ConcurrentModificationException,因此必須捕獲該異常。Stack類Stack繼承自Vector,實(shí)現(xiàn)一個(gè)后進(jìn)先出的堆棧。Stack提供5個(gè)額外的方法使得Vector得以被當(dāng)作堆棧使用?;镜膒ush和pop方法,還有peek方法得到棧頂?shù)脑?,empty方法測(cè)試堆棧是否為空,search方法檢測(cè)一個(gè)元素在堆棧中的位置。Stack剛創(chuàng)建后是空棧。Set接口Set是一種不包含重復(fù)的元素的Collection,即任意的兩個(gè)元素el和e2都有e1.equals(e2)=false,Set最多有一個(gè)null元素。很明顯,Set的構(gòu)造函數(shù)有一個(gè)約束條件,傳入的Collection參數(shù)不能包含重復(fù)的元素。請(qǐng)注意:必須小心操作可變對(duì)象(MutableObject)。如果一個(gè)Set中的可變?cè)馗淖兞俗陨頎顟B(tài)導(dǎo)致Object.equals(Object)=true將導(dǎo)致一些問(wèn)題。M叩接口請(qǐng)注意,M叩沒(méi)有繼承Collection接口,Map提供key到value的映射。一個(gè)M叩中不能包含相同的key,每個(gè)key只能映射一個(gè)valueoM叩接口提供3種集合的視圖,Map的內(nèi)容可以被當(dāng)作一組key集合,一組value集合,或者一組key?value映射。Hashtable類Hashtable繼承Map接口,實(shí)現(xiàn)一個(gè)key?value映射的哈希表。任何非空(non?null)的對(duì)象都可作為key或者valueo添加數(shù)據(jù)使用put(key,value),取出數(shù)據(jù)使用get(key),這兩個(gè)基本操作的時(shí)間開(kāi)銷為常數(shù)。Hashtable通過(guò)initialcapacity和loadfactor兩個(gè)參數(shù)調(diào)整性能。通常缺省的loadfactor0.75較好地實(shí)現(xiàn)了時(shí)間和空間的均衡。增大loadfactor可以節(jié)省空間但相應(yīng)的查找時(shí)間將增大,這會(huì)影響像get和put這樣的操作。使用Hashtable的簡(jiǎn)單示例如下,將1,2,3放到Hashtable中,他們的key分別是"one","two","three”:Hashtablenumbers=newHashtable();numbers.put(“one”,newInteger(1));numbers.put("two'',newInteger(2));numbers.put("three”,newInteger(3));要取出一個(gè)數(shù),比如2,用相應(yīng)的key:Integern=(Integer)numbers.get("two’');System.out.println(44two="+n);由于作為key的對(duì)象將通過(guò)計(jì)算其散列函數(shù)來(lái)確定與之對(duì)應(yīng)的value的位置,因此任何作為key的對(duì)象都必須實(shí)現(xiàn)hashCodc和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當(dāng)作key的話,要相當(dāng)小心,按照散列函數(shù)的定義,如果兩個(gè)對(duì)象相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個(gè)對(duì)象不同,

則它們的hashCode不一定不同,如果兩個(gè)不同對(duì)象的hashCode相同,這種現(xiàn)象稱為沖突,沖突會(huì)導(dǎo)致操作哈希表的時(shí)間開(kāi)銷增大,所以盡量定義好的hashCode。方法,能加快哈希表的操作。如果相同的對(duì)象有不同的hashCode,對(duì)哈希表的操作會(huì)出現(xiàn)意想不到的結(jié)果(期待的get方法返回null),要避免這種問(wèn)題,只需耍牢記一?條:耍同時(shí)復(fù)寫(xiě)equals方法和hashCode方法,而不要只寫(xiě)其中一個(gè)。Hashtable是同步的。HashMap類HashMap和Hashtable類似,不同之處在于HashMap是非同步的,并且允許null,即nullvalue和nullkey。,但是將HashMap視為Collection時(shí)(values。方法可返I可Collection),其迭代子操作時(shí)間開(kāi)銷和HashM叩的容量成比例。因此,如果迭代操作的性能相當(dāng)重要的話,不要將HashMap的初始化容量設(shè)得過(guò)高,或者badfactor過(guò)低。WeakHashMap類WeakHashMap是?種改進(jìn)的HashMap,它對(duì)key實(shí)行“弱弓|用",如果?個(gè)key不再被外部所引用,那么該key可以被GC回收??偨Y(jié)如果涉及到堆棧,隊(duì)列等操作,應(yīng)該考慮用List,對(duì)于需要快速插入,刪除元素,應(yīng)該使用LinkedList,如果需要快速隨機(jī)訪問(wèn)元素,應(yīng)該使用ArrayList。如果程序在單線程環(huán)境中,或者訪問(wèn)僅僅在一個(gè)線程中進(jìn)行,考慮非同步的類,或效率較高,如果多個(gè)線程可能同時(shí)操作一個(gè)類,應(yīng)該使用同步的類。要特別注意對(duì)?哈希表的操作,作為key的對(duì)象要正確復(fù)寫(xiě)equals和hashCode方法。盡量返回接口而非實(shí)際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時(shí),客戶端代碼不用改變。這就是針對(duì)抽象編程。3、其他特征List,Set,Map將持有對(duì)象一律視為Object型別。Collection>List、Set、Map都是接口,不能實(shí)例化。繼承自它們的ArrayList,Vector,HashTable,HashMap是具象class,這些才可被實(shí)例化。vector容器確切知道它所持有的對(duì)象隸屬什么型別。vector不進(jìn)行邊界檢查。三、CollectionsCollections是針對(duì)集合類的一個(gè)幫助類。提供了一系列靜態(tài)方法實(shí)現(xiàn)對(duì)各種集合的搜索、排序、線程完全化等操作。相當(dāng)于對(duì)Array進(jìn)行類似操作的類 Arrayso如,Collections.max(Collectioncoll);取coll中最大的元素。Collections.sort(Listlist);對(duì)list中元素排序四、如何選擇?

1、容器類和Array的區(qū)別、擇取*容器類僅能持有對(duì)象引用(指向?qū)ο蟮闹羔?,而不是將對(duì)象信息copy一份至數(shù)列某位置。*一旦將對(duì)象置入容器內(nèi),便損失了該對(duì)象的型別信息。2,*在各種Lists中,最好的做法是以ArrayList作為缺省選擇。當(dāng)插入、刪除頻繁時(shí),使用LinkedList();Vector總是比ArrayList慢,所以要盡量避免使用。*在各種Sets中,HashSet通常優(yōu)于HashTree(插入、查找)。只有當(dāng)需要產(chǎn)生一個(gè)經(jīng)過(guò)排序的序列,才用TreeSet。HashTree存在的唯一理由:能夠維護(hù)其內(nèi)元素的排序狀態(tài)。*在各種Maps中HashM叩用于快速查找。*當(dāng)元素個(gè)數(shù)固定,用Array,因?yàn)锳rray效率是最高的。結(jié)論:最常用的是ArrayList,HashSet?HashMap?Arrayo注意:1、Collection沒(méi)有g(shù)et()方法來(lái)取得某個(gè)元素。只能通過(guò)iterator。遍歷元素。2、Set和Collection擁有一模一樣的接口。3、List,U以通過(guò)gct()方法來(lái)?次取出個(gè)兀索。使用數(shù)字來(lái)選擇?堆對(duì)象中的?個(gè),get(0)...o(add/gct)4、-一般使用ArrayList。用LinkedList構(gòu)造堆棧stack、隊(duì)列queue。5>Map用put(k,v)/get(k),還可以使用containsKey()/containsValue()來(lái)檢查其中是否含有某個(gè)key/valueoHashMap會(huì)利用對(duì)象的hashCode來(lái)快速找到key。*hashing哈希碼就是將對(duì)象的信息經(jīng)過(guò)一些轉(zhuǎn)變形成一個(gè)獨(dú)一無(wú)二的int值,這個(gè)值存儲(chǔ)在一個(gè)array中。我們都知道所有存儲(chǔ)結(jié)構(gòu)中,array查找速度是最快的。所以,可以加速查找。發(fā)生碰撞時(shí),讓array指向多個(gè)values。即,數(shù)組每個(gè)位置上又生成一個(gè)植表。6、Map中元素,可以將key序列、value序列單獨(dú)抽取出來(lái)。使用keySet。抽取key序列,將imp中的所有keys生成一個(gè)Seto使用values。抽取value序列,將map中的所有values生成一個(gè)Collectiono為什么一個(gè)生成Set,—個(gè)生成Collection?那是因?yàn)?,key總是獨(dú)?無(wú)二的,value允許重復(fù)。CollectionListSetMap區(qū)另U記憶這些都代表了Java中的集合,這里主要從其元素是否有序,是否可重復(fù)來(lái)進(jìn)行區(qū)別記憶,以便恰當(dāng)?shù)厥褂?,?dāng)然還存在同步方面的差異,見(jiàn)上一篇相關(guān)文章。有序否允許元素重復(fù)否Collection否是List是是SetAbstractSet否否HashSetTreeSet是(用二叉樹(shù)排序)MapAbstractMap否使用key-value來(lái)映射和存儲(chǔ)數(shù)據(jù),Key必須惟一,value可以重復(fù)HashM叩TreeM叩是(用二叉樹(shù)排序)http:〃/TrackBack.aspx?PostId=584112List接口對(duì)Collection進(jìn)行了簡(jiǎn)單的擴(kuò)充,它的具體實(shí)現(xiàn)類常用的有ArrayList和LinkedList。你可以將任何東西放到一個(gè)List容器中,并在需要時(shí)從中取出。ArrayList從其命名中可以看出它是一種類似數(shù)組的形式進(jìn)行存儲(chǔ),因此它的隨機(jī)訪問(wèn)速度極快,而LinkedList的內(nèi)部實(shí)現(xiàn)是鏈表,它適合于在鏈表中間需要頻繁進(jìn)行插入和刪除操作。在具體應(yīng)用時(shí)可以根據(jù)需要自由選擇。前面說(shuō)的Iterator只能對(duì)容器進(jìn)行向前遍歷,而Listiterator則繼承了Iterator的思想,并提供了對(duì)List進(jìn)行雙向遍歷的方法。Set接口也是Collection的一種擴(kuò)展,而與List不同的時(shí),在Set中的對(duì)象元素不能重復(fù),也就是說(shuō)你不能把同樣的東西兩次放入同一個(gè)Set容器中。它的常用具體實(shí)現(xiàn)有HashSet和TreeSet類。HashSet能快速定位一個(gè)元素,但是你放到HashSet中的對(duì)象需要實(shí)現(xiàn)hashCode。方法,它使用了前面說(shuō)過(guò)的哈希碼的算法。而TreeSet則將放入其中的元素按序存放,這就要求你放入其中的對(duì)象是可排序的,這就用到了集合框架提供的另外兩個(gè)實(shí)用類Comparable和Comparator。一個(gè)類是可排序的,它就應(yīng)該實(shí)現(xiàn)Comparable接口。有時(shí)多個(gè)類具有相同的排序算法,那就不需要在每分別重復(fù)定義相同的排序算法,只要實(shí)現(xiàn)Comparator接口即可。集合框架中還有兩個(gè)很實(shí)用的公用類:Collections和Arrays.Collections提供了對(duì)一個(gè)Collection容器進(jìn)行諸如排序、復(fù)制、查找和填充等一些非常有用的方法,Arrays則是對(duì)?個(gè)數(shù)組進(jìn)行類似的操作。Map是一種把鍵對(duì)象和值對(duì)象進(jìn)行關(guān)聯(lián)的容器,而一個(gè)值對(duì)象又可以是一個(gè)M叩,依次類推,這樣就可形成一個(gè)多級(jí)映射。對(duì)于鍵對(duì)象來(lái)說(shuō),像Set一樣,一個(gè)Map容器中的鍵對(duì)象不允許重復(fù),這是為了保持查找結(jié)果的一致性;如果有兩個(gè)鍵對(duì)象一樣,那你想得到那個(gè)鍵對(duì)象所對(duì)應(yīng)的值對(duì)象時(shí)就有問(wèn)題了,可能你得到的并不是你想的那個(gè)值對(duì)象,結(jié)果會(huì)造成混亂,所以鍵的唯一性很重要,也是符合集合的性質(zhì)的。當(dāng)然在使用過(guò)程中,某個(gè)鍵所對(duì)應(yīng)的值對(duì)象可能會(huì)發(fā)生變化,這時(shí)會(huì)按照最后一次修改的值對(duì)象與鍵對(duì)應(yīng)。對(duì)于值對(duì)象則沒(méi)有唯一性的要求。你可以將任意多個(gè)鍵都映射到一個(gè)值對(duì)象上,這不會(huì)發(fā)生任何問(wèn)題(不過(guò)對(duì)你的使用卻可能會(huì)造成不便,你不知道你得到的到底是那一個(gè)鍵所對(duì)應(yīng)的值對(duì)象)。Map有兩種比較常用的實(shí)現(xiàn):HashMap和TreeMap。HashMap也用到了哈希碼的算法,以便快速查找一個(gè)鍵,TreeMap則是對(duì)鍵按序存放,因此它便有一些擴(kuò)展的方法,比如firstKeyO,lastKey()等,你還可以從TreeMap中指定一個(gè)范圍以取得其子Map。鍵和值的關(guān)聯(lián)很簡(jiǎn)單,用pub(Objectkey,Objectvalue)方法即可將一一個(gè)鍵與一個(gè)值對(duì)象相關(guān)聯(lián)。用get(Objectkey)可得到與此key對(duì)象所對(duì)應(yīng)的值對(duì)■象。7、Java語(yǔ)言中鏈表和雙向鏈表鏈表是一種重要的數(shù)據(jù)結(jié)構(gòu),在程序設(shè)計(jì)中占有很重要的地位。C語(yǔ)言和C++語(yǔ)言中是用指針來(lái)實(shí)現(xiàn)鏈表結(jié)構(gòu)的,由于Java語(yǔ)言不提供指針,所以有人認(rèn)為在Java語(yǔ)言中不能實(shí)現(xiàn)鏈表,其實(shí)不然,Java語(yǔ)言比C和C++更容易實(shí)現(xiàn)鏈表結(jié)構(gòu)。Java語(yǔ)言中的對(duì)象引用實(shí)際上是一個(gè)指針(本文中的指針均為概念上的意義,而非語(yǔ)言提供的數(shù)據(jù)類型),所以我們可以編寫(xiě)這樣的類來(lái)實(shí)現(xiàn)鏈表中的結(jié)點(diǎn)。classNode(Objectdata;Nodenext;〃指向下一個(gè)結(jié)點(diǎn)將數(shù)據(jù)域定義成Object類是因?yàn)镺bject類是廣義超類,任何類對(duì)象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問(wèn)還需要定義一個(gè)表頭,表頭必須包含指向第一個(gè)結(jié)點(diǎn)的指針和指向當(dāng)前結(jié)點(diǎn)的指針。為了便于在鏈表尾部增加結(jié)點(diǎn),還可以增加?指向鏈表尾部的指針,另外還可以用一個(gè)域來(lái)表示鏈表的大小,當(dāng)調(diào)用者想得到鏈表的大小時(shí),不必遍歷整個(gè)鏈表。下圖是這種鏈表的示意圖:鏈表的數(shù)據(jù)結(jié)構(gòu)我們可以用類List來(lái)實(shí)現(xiàn)鏈表結(jié)構(gòu),用變量Head、Tail、Length>Pointer來(lái)實(shí)現(xiàn)表頭。存儲(chǔ)當(dāng)前結(jié)點(diǎn)的指針時(shí)有一定的技巧,Pointer并非存儲(chǔ)指向當(dāng)前結(jié)點(diǎn)的指針,而是存儲(chǔ)指向它的前趨結(jié)點(diǎn)的指針,當(dāng)其值為null時(shí)表示當(dāng)前結(jié)點(diǎn)是第一個(gè)結(jié)點(diǎn)。那么為什么要這樣做呢?這是因?yàn)楫?dāng)刪除當(dāng)前結(jié)點(diǎn)后仍需保證剩下的結(jié)點(diǎn)構(gòu)成鏈表,如果Pointer指向當(dāng)前結(jié)點(diǎn),則會(huì)給操作帶來(lái)很大困難。那么如何得到當(dāng)前結(jié)點(diǎn)呢,我們定義了一個(gè)方法cursor。,返回值是指向當(dāng)前結(jié)點(diǎn)的指針。類List還定義了一些方法來(lái)實(shí)現(xiàn)對(duì)鏈表的基本操作,通過(guò)運(yùn)用這些基本操作我們可以對(duì)鏈表進(jìn)行各種操作。例如reset()方法使第一個(gè)結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn)。insert(Objectd)方法在當(dāng)前結(jié)點(diǎn)前插入一個(gè)結(jié)點(diǎn),并使其成為當(dāng)前結(jié)點(diǎn)。remove。方法刪除當(dāng)前結(jié)點(diǎn)同時(shí)返回其內(nèi)容,并使其后繼結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn),如果刪除的是最后一個(gè)結(jié)點(diǎn),則第一個(gè)結(jié)點(diǎn)變?yōu)楫?dāng)前結(jié)點(diǎn)。鏈表類List的源代碼如下:importjava.io.*;publicclassList(/*用變量來(lái)實(shí)現(xiàn)表頭*/privateNodeHead=null;privateNodeTail=null;privateNodePointer=null;privateintLength=O;publicvoiddeleteAll()/*清空整個(gè)鏈表*/(Head=null;Tail=null;Pointer=null;Length=0;publicvoidresetO/*鏈表復(fù)位,使第一個(gè)結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn)*/Pointer=null;}publicbooleanisEmpty()/*判斷鏈表是否為空*/{return(Length==0);}publicbooleanisEnd()/*判斷當(dāng)前結(jié)點(diǎn)是否為最后一個(gè)結(jié)點(diǎn)*/{if(Length=O)thrownewjava.lang.NullPointerExceptionO;elseif(Length==l)returntrue;elsereturn(cursor()==Tai1);)publicObjectnextNode()/*返回當(dāng)前結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)的值,并使其成為當(dāng)前結(jié)點(diǎn)*/(if(Length==l)thrownewjava.util.NoSuchElementException();elseif(Length==0)thrownewjava.lang.NullPointerExceptionO;else(Nodetemp=cursor();if(temp!=Tai1)return(temp.next,data);elsethrownewjava.util.NoSuchElementExceptionO;)}publicObjectcurrentNode()/*返回當(dāng)前結(jié)點(diǎn)的值*/(Nodetemp=cursor();returntemp,data;)publicvoidinsert(Objectd)/*在當(dāng)前結(jié)點(diǎn)前插入一個(gè)結(jié)點(diǎn),并使其成為當(dāng)前結(jié)點(diǎn)*/(Nodee=newNode(d);if(Length-0){Tail=e;Head=e;)else(Nodetemp=cursor();e.next=temp;if(Pointer==null)Head=e;elsePointer.next=e;Length++;publicintsize()/*返回鏈表的大小*/(return(Length);}publicObjectremove()/*將當(dāng)前結(jié)點(diǎn)移出鏈表,下?個(gè)結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn),如果移出的結(jié)點(diǎn)是最后一個(gè)結(jié)點(diǎn),則第一個(gè)結(jié)點(diǎn)成為當(dāng)前結(jié)點(diǎn)*/{Objecttemp;if(Length==0)thrownewjava.util.NoSuchElementExceptionO;elseif(Length==l)(temp=Head,data;deleteAll();}else(Nodecur=cursor();temp=cur.data;if(cur二二Head)Head=cur.next;elseif(cur==Tail){Pointer,next=null;Tail=Pointer;reset();elsePointer.next=cur.next;Length ;}returntemp;)privateNodecursor()/*返回當(dāng)前結(jié)點(diǎn)的指針*/{if(Head==null)thrownewjava.lang.NullPointerExceptionO;elseif(Pointer==null)returnHead;elsereturnPointer,next;}publicstaticvoidmain(String[]args)/*鏈表的簡(jiǎn)單應(yīng)用舉例*/(Lista=newList();for(inti=l;i<=10;i++)a.insert(newInteger(i));System,out.println(a.currentNode());while(!a.isEndO)System,out.println(a.nextNodeO);a.reset();while(!a.isEnd())a.remove();a.remove();a.reset();if(a.isEmpty())System.out?printIn(^ThereisnoNodeinList\n");System,in.printin("Youcanpressreturntoquit\n");try(System,in.read():〃確保用戶看清程序運(yùn)行結(jié)果)catch(lOExceptione)()))classNode/*構(gòu)成鏈表的結(jié)點(diǎn)定義*/{Objectdata;Nodenext;Node(Objectd)(data=d;next=null;))讀者還可以根據(jù)實(shí)際需要定義新的方法來(lái)對(duì)鏈表進(jìn)行操作。雙向鏈表可以用類似的方法實(shí)現(xiàn)只是結(jié)點(diǎn)的類增加了一個(gè)指向前趨結(jié)點(diǎn)的指針??梢杂眠@樣的代碼來(lái)實(shí)現(xiàn):classNode(Objectdata;Nodenext;Nodeprevious;Node(Objectd)(data=d;next=null;previous=nul1;當(dāng)然,雙向鏈表基本操作的實(shí)現(xiàn)略有不同。鏈表和雙向鏈表的實(shí)現(xiàn)方法,也可以用在堆棧和隊(duì)列的實(shí)現(xiàn)中,這里就不再多寫(xiě)了,有興趣的讀者可以將List類的代碼稍加改動(dòng)即可。(1)簡(jiǎn)單鏈表Java代碼_packageChapterFive;classLink<E>{publicEdata;6publicLink<E>next;8publicLink(Edata){this.data=data;H}

1314151617181920212223242526272829303132333435363738394041424344454647484950515253545556classLinkList<E>{publicLink<E>first;//鏈表中數(shù)據(jù)項(xiàng)的個(gè)數(shù)publicintsize;publicLinkList(){first=null;size=0;}//在表頭插入新的數(shù)據(jù)publicvoidinsertFirst(Evalue){Link<E>link=newLink<E>(value);link.next=first;first=link;size++;)//判斷鏈表是否為空publicbooleanisEmpty(){returnsize==0;)//刪除表頭publicLink<E>deleteFirst(){Link<E>temp=first;first=first.next;size--;returntemp;}//輸出鏈表中的所有數(shù)據(jù)publicvoiddisplay(){Link<E>curr=first;while(curr!=null){System.out.print(curr.data+"n);curr=curr.next;System.out.printIn();)//返回鏈表中數(shù)據(jù)項(xiàng)的個(gè)數(shù)publicintsize(){returnsize;)//獲取從頭至尾的第i個(gè)數(shù)據(jù)項(xiàng)publicLink<E>get(inti){

if(i>size()-1||i<0)try(thrownewIndexOutOfBoundsException();}catch(Exceptione){e.printStackTrace();)Link<E>curr=first;for(intn=0;n<size();n++){if(n==i)returncurr;elsecurr=curr.next;returnnull;)//輸出從頭至尾的第i個(gè)數(shù)據(jù)項(xiàng)publicvoidremove(inti){if(i==0)deleteFirst();elseif(i==size()-1)get(i-1).next=null;else{get(i-1).next=get(i+1);}size--;publicclassLink_list{publicstaticvoidmain(String[]args){LinkList<Long>11=newLinkList<Long>();for(inti=0;i<10;i++){Longvalue=(long)(Math.random()*100);11,insertFirst(value);11.display();while(Ill.isEmpty()){11.deleteFirst();11.display();57585960616263646566676869707172737475767778798081828384858687888990919293949596979899System.out.printIn("Okn);100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139(2)鏈棧Java代碼「二1packageChapterFive;classLinkStack<E>{LinkList<E>linkList;intsize;publicLinkstack(){size=0;linkList=newLinkList<E>();)〃入棧publicvoidpush(Evalue){linkList.insertFirst(value);size++;)//出棧publicLink<E>pop(){size——;returnlinkList.deleteFirst();)//返回棧頂元素publicLink<E>top(){returnlinkList.first;)〃判斷棧是否為空publicbooleanisEmpty(){returnsize==0;)//顯示棧中的全部數(shù)據(jù)publicvoiddisplay(){linkList.display();))publicclassLink_stack{publicstaticvoidmain(String[]args){LinkStack<Long>Is=newLinkStack<Long>();for(inti=0;i<10;i++){

140 Longvalue=newLong((long)(Math.random()*100));141 Is.push(value);TOC\o"1-5"\h\z142 }143 while (!Is.isEmpty()) {144 Is.pop();145 Is.display();146 }147 System.out.printIn(MOk");148 )149)(3)有序表Java代碼」15()packageChapterFive;151152classSortedLink{153154publicLink<Long>first;155156 intsize;157158 publicSortedLink() {159 first=null;160 size=0;161 }162 //向有序鏈表中插入數(shù)據(jù)163 publicvoidinsert(longvalue){164 Link<Long>newLink=newLink<Long>(value);165 Link<Long>previous=null;166 Link<Long>curr=first;167 while(curr!=null&&(value > curr.data)){168 previous=curr;169 curr=curr.next;170 }171 if(previous == null)//鏈表為空(在表頭插入)172 first=newLink;173 else174 previous.next=newLink;〃插入新的節(jié)點(diǎn)175 newLink.next = curr;176 size++;177 )178 //刪除第一個(gè)節(jié)點(diǎn)179publicLink<Long>remove(){Link<Long>temp = first;first=first.next;size―;returntemp;TOC\o"1-5"\h\z)//判斷鏈表是否為空public booleanisEmpty(){returnsize==0;}//輸出鏈表的所有數(shù)據(jù)public voiddisplay() {Link<Long>curr=first;while(curr!=null){System,out.print(curr.data+**")curr=curr.next;}196 System.out.printIn();197 )198)19920()publicclassSortedLinkApp{201publicstaticvoidmain(String[]arg

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論