Java程序員面試分類模擬21_第1頁
Java程序員面試分類模擬21_第2頁
Java程序員面試分類模擬21_第3頁
Java程序員面試分類模擬21_第4頁
Java程序員面試分類模擬21_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java程序員面試分類模擬21一、單項(xiàng)選擇題1.

如果用數(shù)組S[0...n]作為兩個(gè)棧S1和S2的存儲結(jié)構(gòu),對任何一個(gè)棧,只有當(dāng)S全滿時(shí)才不能做入棧操作,那么為S1、S2這兩個(gè)棧分配空間的最佳方案是___(江南博哥)___。A.S1的棧底位置為0,S2的棧底位置為n+1B.S1的棧底位置為1,S2的棧底位置為n/2C.S1的棧底位置為0,S2的棧底位置為n/2D.S1的棧底位置為1,S2的棧底位置為n+1正確答案:A[解析]棧是一個(gè)后進(jìn)先出、先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),當(dāng)采用選項(xiàng)A的方案時(shí),兩個(gè)棧的棧底位置分別設(shè)在了存儲空間的兩端,棧項(xiàng)各自向中間延伸,兩個(gè)棧的空間就可以相互調(diào)節(jié),充分共享所有的存儲空間,互補(bǔ)余缺,只有在整個(gè)存儲空間被占滿時(shí),才會(huì)發(fā)生上溢,這樣產(chǎn)生上溢的概率要小得多。所以,選項(xiàng)A正確。

如果采用選項(xiàng)B或者選項(xiàng)C的方案,相當(dāng)于把數(shù)組平均分配給兩個(gè)棧,各自有獨(dú)立的存儲空間,即使當(dāng)棧s2為空的時(shí)候,棧s1最多能存放的元素個(gè)數(shù)為n/2。所以,選項(xiàng)B、選項(xiàng)C錯(cuò)誤。

對于選項(xiàng)D,s1的棧底位置設(shè)置不正確,所以,選項(xiàng)D錯(cuò)誤。

所以,本題的答案為A。

2.

有如下代碼:a=0;c=0;do{--c;a=a-1;}while(a>0);

當(dāng)執(zhí)行完以上代碼后,變量c的值是______。A.-2B.1C.-1D.死循環(huán)正確答案:C[解析]dowhile循環(huán)首先會(huì)執(zhí)行一次代碼塊,然后再檢查循環(huán)條件是否為真,如果條件為真,就會(huì)重復(fù)這個(gè)循環(huán),否則,結(jié)束循環(huán)。

對于本題而言,變量c被初始化為0,由于dowhile循環(huán)的性質(zhì),此時(shí)會(huì)首先進(jìn)入循環(huán)體執(zhí)行--c運(yùn)算,運(yùn)算完之后,變量c的值變?yōu)?1,然后執(zhí)行a=a-1語句,執(zhí)行完畢后,變量a的值變?yōu)?1,緊接著,判斷變量a與0的大小關(guān)系,由于不滿足a>0這一循環(huán)條件,此時(shí)循環(huán)結(jié)束,c的值為-1。所以,選項(xiàng)C正確。

3.

有如下代碼:

publicclassTest

{

publicstaticvoidstringReplace(Stringtext)

{

text=text+"c";

}

publicstaticvoidbufferReplace(StringBuffertext)

{

text=text.append("c");

}

publicstaticvoidmain(Stringargs[])

{

StringtextString=newString("ab");

StringBuffertextBuffer=newStringBuffer("ab");

stringReplace(textString);

bufferReplace(textBuffer);

System.out.pIintln(textString+textBuffer);

}

}

當(dāng)編譯并運(yùn)行上面程序時(shí),輸出結(jié)果是______。A.編譯并運(yùn)行輸出ab

abB.編譯并運(yùn)行輸出abc

abcC.編譯并運(yùn)行輸出ab

abcD.編譯并運(yùn)行輸出abc

ab正確答案:C[解析]String和StringBuffer都是類,在方法調(diào)用的時(shí)候,二者傳遞的都是引用值(可以理解為傳遞的是它們的地址),對于String而言,由于String是不可變量,一旦賦值后,它的內(nèi)容就不能被修改了。

從本質(zhì)上來講,引用傳遞是通過值傳遞實(shí)現(xiàn)的(傳遞了引用的值,或者可以理解為傳遞的是對象地址的值),對于本題而言,在調(diào)用stringReplace方法的時(shí)候,首先把實(shí)參textString的值復(fù)制給形參text(textString是字符串“ab”的引用,或者可以理解為是“ab”的地址),當(dāng)在方法stringReplace內(nèi)執(zhí)行語句text=text+"c"的時(shí)候,相當(dāng)于創(chuàng)建了一個(gè)新的字符串對象“abc”,然后text指向這個(gè)字符串對象,這并沒有改變實(shí)參textString的值,因此,在調(diào)用結(jié)束后,textString指向的字符串的值還是“ab”。StringBuffer不是不可變量,在調(diào)用bufferReplace方法的時(shí)候,先把實(shí)參的值textBuffer賦值給形參text(字符串“ab”的引用,或可以理解為地址),在調(diào)用text.append("c")的時(shí)候,會(huì)直接對text指向的字符串后面拼接一個(gè)字符串“c”,由于text與textBuffer指向同一個(gè)字符串,因此,這個(gè)對形參的修改也會(huì)影響到實(shí)參的值,調(diào)用結(jié)束后textBuffer的值為“abc”。所以,選項(xiàng)C正確。

4.

一個(gè)關(guān)系模式為Y(X1,X2,X3,X4),假定該關(guān)系存在著如下函數(shù)依賴:(X1,X2)→X3,X2→X4,則該關(guān)系屬于______。A.第一范式B.第二范式C.第三范式D.第四范式正確答案:A[解析]范化是在識別數(shù)據(jù)庫中的數(shù)據(jù)元素、關(guān)系,以及定義所需的表和各表中的項(xiàng)目這些初始工作之后的一個(gè)細(xì)化的過程。常見的范式有1NF、2NF、3NF、BCNF以及4NF。以下將分別對這幾種范式進(jìn)行介紹。

1NF,即第一范式,是指數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項(xiàng),同一列中不能有多個(gè)值,即實(shí)體中的某個(gè)屬性不能有多個(gè)值或者不能有重復(fù)的屬性。如果出現(xiàn)重復(fù)的屬性,就可能需要定義一個(gè)新的實(shí)體,新的實(shí)體由重復(fù)的屬性構(gòu)成,新實(shí)體與原實(shí)體之間為一對多關(guān)系。第一范式的模式要求屬性值不可再分裂成更小部分,即屬性項(xiàng)不能是屬性組合或由組屬性組成。簡而言之,第一范式就是無重復(fù)的列。例如,由“職工號”“姓名”“電話號碼”組成的表(一個(gè)人可能有一個(gè)辦公電話和一個(gè)移動(dòng)電話),這時(shí)將其規(guī)范化為1NF可以將電話號碼分為“辦公電話”和“移動(dòng)電話”兩個(gè)屬性,即職工(職工號,姓名,辦公電話,移動(dòng)電話)。

2NF,即第二范式,是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數(shù)據(jù)庫表中的每個(gè)實(shí)例或行必須可以被唯一地區(qū)分。為實(shí)現(xiàn)區(qū)分通常需要為表加上一個(gè)列,以存儲各個(gè)實(shí)例的唯一標(biāo)識。如果關(guān)系模式R為第一范式,并且R中每一個(gè)非主屬性完全函數(shù)依賴于R的某個(gè)候選鍵,則稱R為第二范式模式。

(如果A是關(guān)系模式R的候選鍵的一個(gè)屬性,則稱A是R的主屬性,否則稱A是R的非主屬性。)例如,在選課關(guān)系表(學(xué)號,課程號,成績,學(xué)分),關(guān)鍵字為組合關(guān)鍵字(學(xué)號,課程號),但由于非主屬性學(xué)分僅依賴于課程號,對關(guān)鍵字(學(xué)號,課程號)只是部分依賴,而不是完全依賴,所以,此種方式會(huì)導(dǎo)致數(shù)據(jù)冗余以及更新異常等問題,解決辦法是將其分為兩個(gè)關(guān)系模式:學(xué)生表(學(xué)號,課程號,分?jǐn)?shù))和課程表(課程號,學(xué)分),新關(guān)系通過學(xué)生表中的外鍵字課程號聯(lián)系,在需要時(shí)通過兩個(gè)表的連接來取出數(shù)據(jù)。

3NF,即第三范式,如果關(guān)系模式R是第二范式,且每個(gè)非主屬性都不傳遞依賴于R的候選鍵,則稱R是第三范式的模式。例如學(xué)生表(學(xué)號,姓名,課程號,成績),其中學(xué)生姓名無重名,所以,該表有兩個(gè)候選碼(學(xué)號,課程號)和(姓名,課程號),則存在函數(shù)依賴:學(xué)號→姓名,

(學(xué)號,課程號)→成績,(姓名,課程號)→成績,唯一的非主屬性成績對碼不存在部分依賴,也不存在傳遞依賴,所以,屬于第三范式。

BCNF構(gòu)建在第三范式的基礎(chǔ)上,如果關(guān)系模式R是第一范式,且每個(gè)屬性都不傳遞依賴于R的候選鍵,那么稱R為BCNF的模式。假設(shè)倉庫管理關(guān)系表(倉庫號,存儲物品號,管理員號,數(shù)量),滿足一個(gè)管理員只在一個(gè)倉庫工作;一個(gè)倉庫可以存儲多種物品。則存在如下關(guān)系:

(倉庫號,存儲物品號)→(管理員號,數(shù)量)

(管理員號,存儲物品號)→(倉庫號,數(shù)量)

所以,(倉庫號,存儲物品號)和(管理員號,存儲物品號)都是倉庫管理關(guān)系表的候選碼,表中的唯一非關(guān)鍵字段為數(shù)量,它是符合第三范式的。但是,由于存在如下決定關(guān)系:

(倉庫號)→(管理員號)

(管理員號)→(倉庫號)

即存在關(guān)鍵字段決定關(guān)鍵字段的情況,所以,其不符合BCNF范式。把倉庫管理關(guān)系表分解為二個(gè)關(guān)系表:倉庫管理表(倉庫號,管理員號)和倉庫表(倉庫號,存儲物品號,數(shù)量),這樣的數(shù)據(jù)庫表是符合BCNF范式的,消除了刪除異常、插入異常和更新異常。

4NF,即第四范式,設(shè)R是一個(gè)關(guān)系模式,D是R上的多值依賴集合。如果D中成立非平凡多值依賴X→Y時(shí),X必是R的超鍵,那么稱R是第四范式的模式。例如,職工表(職工編號,職工孩子姓名,職工選修課程),在這個(gè)表中同一個(gè)職工也可能會(huì)有多個(gè)職工孩子姓名,同樣,同一個(gè)職工也可能會(huì)有多個(gè)職工選修課程,即這里存在著多值事實(shí),不符合第四范式。如果要符合第四范式,只需要將上表分為兩個(gè)表,使它們只有一個(gè)多值事實(shí),例如職工表一(職工編號,職工孩子姓名),職工表二(職工編號,職工選修課程),兩個(gè)表都只有一個(gè)多值事實(shí),所以,符合第四范式。

對于本題而言,這個(gè)關(guān)系模式的候選鍵為{X1,X2},因?yàn)閄2→X4,說明有非主屬性X4部分依賴于候選鍵{X1,X2},所以,這個(gè)關(guān)系模式不為第二范式。

所以,本題的答案為A。

5.

下列關(guān)于形式參數(shù)的描述中,正確的是______。A.形式參數(shù)可被視為局部變量B.形式參數(shù)不可以是對象C.形式參數(shù)為方法被調(diào)用時(shí)真正被傳遞的參數(shù)D.形式參數(shù)可被字段修飾符修飾正確答案:A[解析]形參全稱為“形式參數(shù)”,是在定義方法名和方法體的時(shí)候使用的參數(shù),目的是用來接收調(diào)用該方法時(shí)傳遞的參數(shù)。它的作用范圍是整個(gè)方法體,是在方法調(diào)用時(shí)的一個(gè)臨時(shí)變量。實(shí)參出現(xiàn)在主調(diào)方法中,在方法調(diào)用的時(shí)候把實(shí)參的值賦給對應(yīng)的形參,在被調(diào)用方法的內(nèi)部只能使用形參,不能使用實(shí)參。

具體而言,實(shí)參和形參的主要區(qū)別如下:

1)形參的作用范圍為方法內(nèi)部,當(dāng)方法調(diào)用結(jié)束后,形參的生命周期也就結(jié)束了,因此,在方法外不能使用形參,它只有在被調(diào)用時(shí)才分配內(nèi)存單元,調(diào)用結(jié)束后會(huì)立刻釋放內(nèi)存空間,而實(shí)參不能在調(diào)用方法的內(nèi)部使用。

2)在方法調(diào)用的時(shí)候,只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此,在方法調(diào)用過程中,對形參值的改變不會(huì)影響實(shí)參的值。

本題中,對于選項(xiàng)A,形參的作用范圍只在這個(gè)方法內(nèi),因此,可以被看作LocalVariable(局部變量)。因此,選項(xiàng)A正確。

對于選項(xiàng)B,形參可以是原始的數(shù)據(jù)類型(例如int、long、char)等,也可以是對象(例如String、List或自定義對象類型)。因此,選項(xiàng)B不正確。

對于選項(xiàng)C,在方法調(diào)用時(shí),真正被傳遞的參數(shù)為實(shí)參。因此,選項(xiàng)C不正確。

對于選項(xiàng)D,形參不能被字段修飾符(例如public、protected、private等)修飾。因此,選項(xiàng)D不正確。

6.

系統(tǒng)中的“顛簸”是由______引起的。A.內(nèi)存容量不足B.缺頁率高C.交換信息量大D.缺頁率反饋模型不正確正確答案:B[解析]如果分配給進(jìn)程的存儲塊數(shù)量小于進(jìn)程所需要的最小值,進(jìn)程的運(yùn)行將很頻繁地產(chǎn)生缺頁中斷,這種頻率非常高的頁面置換現(xiàn)象稱為抖動(dòng),也稱為“顛簸”。在請求分頁存儲管理中,可能出現(xiàn)這種情況,即對剛被替換出去的頁,立即又要被訪問。需要將它調(diào)入,因?yàn)闆]有空閑內(nèi)存又要替換另一頁,而后者又是即將被訪問的頁,于是造成了系統(tǒng)需花費(fèi)大量的時(shí)間忙于進(jìn)行這種頻繁的頁面交換,致使系統(tǒng)的實(shí)際效率很低,嚴(yán)重導(dǎo)致系統(tǒng)癱瘓。

通過上面的分析可知,“顛簸”是由缺頁率高引起的。所以,選項(xiàng)B正確。

7.

以下不可以查看某IP是否可達(dá)的方式/命令是______。A.telnetB.PINGC.tracertD.top正確答案:D[解析]對于選項(xiàng)A,telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠(yuǎn)程登陸服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了在本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。在終端使用者的計(jì)算機(jī)上使用telnet程序,用它連接到服務(wù)器。終端使用者可以在telnet程序中輸入命令,這些命令會(huì)在服務(wù)器上運(yùn)行,就像直接在服務(wù)器的控制臺上輸入一樣。因此,選項(xiàng)A正確。

對于選項(xiàng)B,PING命令可以檢查網(wǎng)絡(luò)是否連通,可以很好地幫助進(jìn)行分析和判定網(wǎng)絡(luò)故障。應(yīng)用格式:ping空格lP地址。該命令還可以添加許多參數(shù)使用,具體是鍵入PING命令,然后輸入回車即可查看到詳細(xì)說明。因此,選項(xiàng)B正確。

對于選項(xiàng)C,tracert(跟蹤路由)是路由跟蹤實(shí)用程序,用于確定IP數(shù)據(jù)包訪問目標(biāo)所采取的路徑。tracert命令用IP生存時(shí)間(TTL)字段和ICMP錯(cuò)誤消息來確定從一個(gè)主機(jī)到網(wǎng)絡(luò)上其他主機(jī)的路由。因此,選項(xiàng)C正確。

對于選項(xiàng)D,top命令是Linux下常用的性能分析工具,能夠?qū)崟r(shí)顯示系統(tǒng)中各個(gè)進(jìn)程的資源占用狀況。因此,選項(xiàng)D錯(cuò)誤。

8.

在Java語言中,下列不能派生出子類的類為______。A.publicclassTest{}B.classTest{}C.abstractclassTest{}D.finalclassTest{}正確答案:D[解析]在Java語言中,被final關(guān)鍵字修飾的類是不能被繼承的。所以,選項(xiàng)D正確。

9.

有如下代碼:

publicclassTestextendsThread

{

publicstaticvoidmain(Stringargv[])

{

Testb=newTest();

b.run();

}

publicvoidstart()

{

for(inti=0;i<10;i++)

{

System.out.println("Valueofi="+i);

}

}

}

當(dāng)編譯并運(yùn)行上面程序時(shí),輸出結(jié)果是______。A.編譯錯(cuò)誤,指明run方法沒有定義B.運(yùn)行錯(cuò)誤,指明run方法沒有定義C.編譯通過并輸出0到9D.編譯通過但無輸出正確答案:D[解析]在Java語言中,可以采用以下兩種方法來創(chuàng)建線程:繼承Thread類與實(shí)現(xiàn)Runnable接口。其中,在使用Runnable接口時(shí),需要建立一個(gè)Thread實(shí)例。所以,無論是通過Thread類創(chuàng)建線程還是通過Runnable接口創(chuàng)建線程,都必須建立Thread類或它的子類的實(shí)例。

Thread類提供了一個(gè)start()方法,該方法的功能是讓這個(gè)線程開始執(zhí)行,當(dāng)這個(gè)線程開始執(zhí)行后,JVM將會(huì)調(diào)用這個(gè)線程的run()方法來執(zhí)行這個(gè)線程的任務(wù)。在實(shí)現(xiàn)多線程時(shí),在繼承了Thread類后必須實(shí)現(xiàn)run()方法,也就是說,線程的核心邏輯都存在于run()方法中,這個(gè)方法被start()方法調(diào)用來實(shí)現(xiàn)多線程的功能,如果直接調(diào)用run()方法,就與調(diào)用普通的方法類似。

對于本題而言,Test類繼承了Thread類,但是沒有重寫Thread類的run()方法,因此,b.run()實(shí)際上調(diào)用的是Tbread類的run()方法,而Thread類的run()方法的方法體為空,故這個(gè)程序能編譯通過,但是沒有輸出結(jié)果。所以,選項(xiàng)D正確。

10.

有如下代碼:longtemp=(int)3.9;temp%=2;

那么,變量temp的最終值是______。A.0B.1C.2D.4正確答案:B[解析]在Java語言中,當(dāng)參與運(yùn)算的兩個(gè)變量的數(shù)據(jù)類型不同時(shí),就需要進(jìn)行隱式的數(shù)據(jù)類型轉(zhuǎn)換,轉(zhuǎn)換的原則為:從低精度向高精度轉(zhuǎn)換,即優(yōu)先級滿足byte<short<char<int<long<float<double。例如,不同數(shù)據(jù)類型的值在進(jìn)行運(yùn)算時(shí),short類型數(shù)據(jù)能夠自動(dòng)轉(zhuǎn)換為int型,int類型數(shù)據(jù)能夠自動(dòng)轉(zhuǎn)換為float等。反之,則需要通過強(qiáng)制類型轉(zhuǎn)換來實(shí)現(xiàn)。在Java語言中,類型轉(zhuǎn)換可以分為以下幾種類型:

(1)類型自動(dòng)轉(zhuǎn)換

低級數(shù)據(jù)類型可以自動(dòng)轉(zhuǎn)換為高級數(shù)據(jù)類型,下表給出常見的自動(dòng)轉(zhuǎn)換的條件。自動(dòng)轉(zhuǎn)換條件操作數(shù)1類型操作數(shù)2類型轉(zhuǎn)換后的類型longbyteshortcharintlongintbyteshortcharintfloatbyteshortintcharlongfloatdoublebyteshortintlongcharfloatdouble當(dāng)類型自動(dòng)轉(zhuǎn)換時(shí),需要注意以下幾點(diǎn)內(nèi)容:1)char類型的數(shù)據(jù)轉(zhuǎn)換為高級類型(例如int、long等),會(huì)轉(zhuǎn)換為對應(yīng)的ASCII碼。2)byte、char、short類型的數(shù)據(jù)在參與運(yùn)算的時(shí)候,會(huì)自動(dòng)轉(zhuǎn)換為int型。但當(dāng)使用+=運(yùn)算的時(shí)候,就不會(huì)產(chǎn)生類型的轉(zhuǎn)換。3)在Java語言中,另外一個(gè)與C/C++語言不同的地方是,基本數(shù)據(jù)類型與boolean類型是不能相互轉(zhuǎn)換的。總之,當(dāng)有多種類型的數(shù)據(jù)混合運(yùn)算時(shí),系統(tǒng)首先自動(dòng)將所有數(shù)據(jù)轉(zhuǎn)換成容量最大的那一種數(shù)據(jù)類型,然后再進(jìn)行計(jì)算。(2)強(qiáng)制類型轉(zhuǎn)換當(dāng)需要從高級類型轉(zhuǎn)換為低級數(shù)據(jù)類型的時(shí)候,就需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,下表給出可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換的條件。強(qiáng)制轉(zhuǎn)換條件原操作數(shù)類型轉(zhuǎn)換后操作數(shù)類型bytecharcharbyteshortbytecharintbyteshortcharlongbyteshortcharfloatbyteshortcharintlongDoublebyteshortcharintlong

需要注意的是,在進(jìn)行強(qiáng)制類型轉(zhuǎn)換的時(shí)候可能會(huì)丟失精度。

對于本題而言,賦值語句longtemp=(int)3.9的過程如下:首先,把浮點(diǎn)數(shù)3.9強(qiáng)制轉(zhuǎn)化為int類型,在轉(zhuǎn)換的過程中會(huì)直接丟掉小數(shù)部分,轉(zhuǎn)換結(jié)果為3,接著在賦值給long型變量temp的時(shí)候,會(huì)隱式地將該值轉(zhuǎn)換為long類型,由于是從低精度向高精度轉(zhuǎn)換,所以,在轉(zhuǎn)換過程中不會(huì)有精度丟失,轉(zhuǎn)換結(jié)果仍然為3;接著執(zhí)行語句temp%=2,該語句等價(jià)于temp=temp%2,用來求temp除以2的余數(shù),3%2,顯然,結(jié)果為1。所以,選項(xiàng)B正確。

11.

下列用于產(chǎn)生數(shù)字簽名的是______。A.接收方的私鑰B.發(fā)送方的私鑰C.發(fā)送方的公鑰D.接收方的公鑰正確答案:B[解析]要想找出正確答案,首先需要弄懂?dāng)?shù)字簽名的定義,在ISO7498-2標(biāo)準(zhǔn)中,數(shù)字簽名的定義如下:“附加在數(shù)據(jù)單元上的一些數(shù)據(jù),或者對數(shù)據(jù)單元所做的密碼變換,這種數(shù)據(jù)和變換允許數(shù)據(jù)單元的接收者用以確認(rèn)數(shù)據(jù)單元來源和數(shù)據(jù)單元的完整性,并保護(hù)數(shù)據(jù),防止被人(例如接收者)進(jìn)行偽造”。它是不對稱加密算法的典型應(yīng)用,依靠公鑰加密技術(shù)來實(shí)現(xiàn)。在公鑰加密技術(shù)里,每一個(gè)使用者都有一對密鑰:一把公鑰和一把私鑰,公鑰可以自由發(fā)布,但私鑰則秘密保存。

具體而言,數(shù)字簽名的應(yīng)用過程如下:數(shù)據(jù)源發(fā)送方使用自己的私鑰對數(shù)據(jù)校驗(yàn)和或其他與數(shù)據(jù)內(nèi)容有關(guān)的變量進(jìn)行加密處理,完成對數(shù)據(jù)的合法“簽名”,數(shù)據(jù)接收方則利用對方的公鑰來解讀收到的“數(shù)字簽名”,并將解讀結(jié)果用于對數(shù)據(jù)完整性的檢驗(yàn),以確認(rèn)簽名的合法性。數(shù)字簽名技術(shù)是在網(wǎng)絡(luò)系統(tǒng)虛擬環(huán)境中確認(rèn)身份的重要技術(shù),完全可以代替現(xiàn)實(shí)過程中的“親筆簽字”,在技術(shù)和法律上有保證。在公鑰與私鑰管理方面,數(shù)字簽名應(yīng)用與加密郵件PGP(PrettyGoodPrivacy)技術(shù)正好相反。在數(shù)字簽名應(yīng)用中,發(fā)送者的公鑰可以很方便地得到,但他/她的私鑰則需要嚴(yán)格保密。

為了更好地說明數(shù)字簽名,引用一個(gè)較為通俗易懂的方法。

1)A有兩把鑰匙,一把是公鑰,另一把是私鑰。

2)A把公鑰送給B、C、D,每人一把。

3)D要給A寫一封保密的信。他寫完后用公鑰加密,就可以達(dá)到保密的效果。

4)A收到信后,用私鑰解密,就看到了信件內(nèi)容。注意,只要私鑰不泄露,這封信就是安全的,即使落在別人手里,它也是無法被解密的。

5)A給D回信,決定采用“數(shù)字簽名”。他寫完后先用Hash函數(shù),生成信件的摘要(Digest)。

6)然后,A使用私鑰,對這個(gè)摘要加密,生成“數(shù)字簽名”(Signature)。

7)A將這個(gè)簽名,并附在信件下面,一起發(fā)送給D。

8)D收到信后,取下數(shù)字簽名,用A的公鑰解密,得到信件的摘要。由此證明,這封信確實(shí)是A發(fā)出的。

9)D再對信件本身使用Hash函數(shù),將得到的結(jié)果與上一步得到的摘要進(jìn)行對比。如果兩者一致,就證明這封信未被修改過。

10)復(fù)雜的情況出現(xiàn)了。C想欺騙D,他偷偷使用了D的電腦,用自己的公鑰換走了A的公鑰。此時(shí),D實(shí)際擁有的是C的公鑰,但是還以為這是A的公鑰。因此,C就可以冒充A,用自己的私鑰做“數(shù)字簽名”,寫信給D,讓D用假的公鑰進(jìn)行解密。

11)后來,D感覺不對勁,發(fā)現(xiàn)自己無法確定公鑰是否真的屬于A。她想到了一個(gè)辦法,要求去找“證書中心”(CertificateAuthority,CA)為公鑰做認(rèn)證。證書中心用自己的私鑰,對A的公鑰和一些相關(guān)信息一起加密,生成“數(shù)字證書”(DigitalCertificate)。

12)A拿到數(shù)字證書以后,就可以放心了。以后再給D寫信,只要在簽名的同時(shí),再附上數(shù)字證書就行了。

13)D收信后,用CA的公鑰解開數(shù)字證書,就可以拿到真實(shí)的公鑰了,然后就能證明“數(shù)字簽名”是否真的是A簽的。

根據(jù)上面的分析可知,選項(xiàng)B是正確的。

所以,本題的答案為B。

12.

在虛擬存儲系統(tǒng)中,若進(jìn)程在內(nèi)存中占3塊(開始時(shí)為空),采用先進(jìn)先出頁面淘汰算法,當(dāng)執(zhí)行訪問頁號序列為1、2、3、4、1、2、5、1、2、3、4、5、6時(shí),將產(chǎn)生缺頁中斷的次數(shù)是______。A.10B.9C.8D.7正確答案:A[解析]在地址映射過程中,如果在頁面中發(fā)現(xiàn)所要訪問的頁面不在內(nèi)存中,則產(chǎn)生缺頁中斷。當(dāng)發(fā)生缺頁中斷時(shí),操作系統(tǒng)必須在內(nèi)存中選擇一個(gè)頁面將其移出內(nèi)存,以便為即將調(diào)入的頁面讓出空間。而用來選擇淘汰哪一頁的規(guī)則叫作頁面置換算法,也稱為頁面淘汰算法。

先進(jìn)先出頁面淘汰算法簡稱FIFO(FirstInFirstOut)算法,該算法實(shí)現(xiàn)時(shí),置換出最早進(jìn)入內(nèi)存的頁面,即在內(nèi)存中駐留時(shí)間最久的頁面。該算法實(shí)現(xiàn)簡單,只需把調(diào)入內(nèi)存的頁面根據(jù)先后次序鏈接成隊(duì)列,設(shè)置一個(gè)指針總指向最早的頁面。

本題中,置換過程如下:

1)訪問1,缺頁,調(diào)入1,內(nèi)存中為1。

2)訪問2,缺頁,調(diào)入2,內(nèi)存中為1,2。

3)訪問3,缺頁,調(diào)入3,內(nèi)存中為1,2,3。

4)訪問4,缺頁,調(diào)入4,淘汰1,內(nèi)存中為2,3,4。

5)訪問1,缺頁,調(diào)入1,淘汰2,內(nèi)存中為3,4,1。

6)訪問2,缺頁,調(diào)入2,淘汰3,內(nèi)存中為4,1,2。

7)訪問5,缺頁,調(diào)入5,淘汰4,內(nèi)存中為1,2,5。

8)訪問1,不缺頁,內(nèi)存中為1,2,5。

9)訪問2,不缺頁,內(nèi)存中為1,2,5。

10)訪問3,缺頁,調(diào)入3,淘汰1,內(nèi)存中為2,5,3。

11)訪問4,缺頁,調(diào)入4,淘汰2,內(nèi)存中為5,3,4。

12)訪問5,不缺頁,內(nèi)存中為5,3,4。

13)訪問6,缺頁,調(diào)入6,淘汰3,內(nèi)存中為3,4,6。

所以,一共產(chǎn)生了10次缺頁。因此,選項(xiàng)A正確。

13.

SQL語言中刪除一個(gè)表的指令是______。A.DROPTABLEB.DELETETABLEC.DESTROYTABLED.REMOVETABLE正確答案:A[解析]本題中,對于選項(xiàng)A,在SQL語言中,DROP命令用于刪除表定義及該表的所有數(shù)據(jù)、索引、觸發(fā)器、約束和權(quán)限規(guī)范,所以,選項(xiàng)A正確。

對于選項(xiàng)B,DELETE命令的作用是刪除表中的數(shù)據(jù)。所以,選項(xiàng)B不正確。

對于選項(xiàng)C與選項(xiàng)D,不存在DESTORY、REMOVE命令。所以,選項(xiàng)C和選項(xiàng)D不正確。

TRUNCATETABLE在功能上與不帶WHERE子句的DELETE語句相同:二者均刪除表中的全部行,但TRUNCATETABLE比DELETE速度快,且使用的系統(tǒng)和事務(wù)日志資源少。

所以,本題的答案為A。

14.

在Java語言中,以下定義數(shù)組的語句正確的是______。A.intt[10]=newint[],B.chara[]="abc";C.intt[]=newint[20];D.doubled=newdouble[20];正確答案:C[解析]在Java語言中,一維數(shù)組的聲明方式為:

15.

有如下代碼:publicclassPerson{privateStringname="Person";intage=0;}publicclassChildextendsPerson{publicStringgrade;publicstaticvoidmain(String[]args){Personp=newChild();System.out.println();}}

以上代碼的運(yùn)行結(jié)果是______。A.PersonB.沒有輸出C.編譯出錯(cuò)D.運(yùn)行出錯(cuò)正確答案:C[解析]由于name被private修飾,因此,它對Person的實(shí)例以及Child類都不可見。因此,的寫法是錯(cuò)誤的,會(huì)導(dǎo)致編譯報(bào)錯(cuò)。如果把privateStringname="Person"中的private改成protected,那么程序?qū)?huì)輸出Person。所以,選項(xiàng)C正確。

所以,本題的答案為C。

16.

對于一個(gè)有向圖,若一個(gè)頂點(diǎn)的入度為k1、出度為k2,則對應(yīng)鄰接表中該頂點(diǎn)的單鏈表中的結(jié)點(diǎn)數(shù)為______。A.k1B.k2C.k1-k2D.k1+k2正確答案:A[解析]在有向圖的鄰接表中,某頂點(diǎn)鏈表的結(jié)點(diǎn)個(gè)數(shù)是發(fā)出去的弧的數(shù)量,也就是出度,反過來說,逆鄰接表的某頂點(diǎn)鏈表的結(jié)點(diǎn)個(gè)數(shù)是進(jìn)入的弧的數(shù)量,也就是入度,所以,選項(xiàng)A正確。

17.

Linux系統(tǒng)可執(zhí)行文件屬于root并且有setid,當(dāng)一個(gè)普通用戶mike運(yùn)行這個(gè)程序時(shí),產(chǎn)生的有效用戶和實(shí)際用戶分別是______。A.motmikeB.rootrootC.mikemotD.mikemikeE.deamonmikeF.mikedeamon正確答案:A[解析]在Linux進(jìn)程中涉及多個(gè)用戶ID和用戶組ID,包括如下:

1)實(shí)際用戶ID和實(shí)際用戶組ID:標(biāo)識我是誰。也就是登錄用戶的uid和gid,假如Linux系統(tǒng)以hehe登錄,在Linux系統(tǒng)中運(yùn)行的所有命令的實(shí)際用戶ID都是hehe的uid,實(shí)際用戶組ID都是hehe的gid(可以用id命令查看)。

2)有效用戶ID和有效用戶組ID:用來決定當(dāng)前進(jìn)程對文件的訪問權(quán)限,即實(shí)際該進(jìn)程是以哪個(gè)用戶運(yùn)行的。一般情況下,有效用戶ID等于實(shí)際用戶ID,有效用戶組ID等于實(shí)際用戶組ID。但是當(dāng)可執(zhí)行程序文件的文件模式中設(shè)置了“設(shè)置-用戶-ID(set-user-id)位”時(shí),進(jìn)程的有效用戶ID等于該可執(zhí)行文件的擁有者ID;同樣,如果可執(zhí)行文件的文件模式中設(shè)置了“設(shè)置-用戶組-ID(set-group-id)位”時(shí),則進(jìn)程的有效用戶組ID等于該可執(zhí)行文件的擁有組ID。

所以,本題的答案為A。

18.

下面不是Java類訪問控制關(guān)鍵字的是______。A.privateB.protectedC.thisD.public正確答案:C[解析]在Java語言中,類的權(quán)限訪問修飾符有以下幾種:private、default(package)、protected和public。而關(guān)鍵字this用來指向當(dāng)前實(shí)例對象,它的一個(gè)非常重要的作用就是用來區(qū)分對象的成員變量與方法的形參(當(dāng)一個(gè)方法的形參與成員變量有著相同名字的時(shí)候,就會(huì)覆蓋成員變量)。為了能夠?qū)﹃P(guān)鍵字this有一個(gè)更好的認(rèn)識,首先創(chuàng)建一個(gè)類People,示例如下:classPeople{Stringname;//正確的寫法publicPeople(Stringname){=name;}//錯(cuò)誤的寫法publicPeople(Stringname){name=name;}}

上例中,第一個(gè)構(gòu)造方法使用來表示左邊的值為成員變量,而不是這個(gè)構(gòu)造方法的形式參數(shù)。對于第二個(gè)構(gòu)造方法,由于在這個(gè)方法中形參與成員變量有著相同的名字,因此,對于語句name=name,等號左邊和右邊的兩個(gè)name都代表的是形式參數(shù)。在這種情況下,只有通過this才能訪問到成員變量。

所以,本題的答案為C。

19.

有如下代碼:classAextendsB{publicA(){super();}}

以下關(guān)于super用法的描述中,正確的是______。A.用來調(diào)用類A中定義的super()方法B.用來調(diào)用類B中定義的super()方法C.用來調(diào)用類B中的無參構(gòu)造方法D.用來調(diào)用類B中第一個(gè)出現(xiàn)的構(gòu)造方法正確答案:C[解析]在Java語言中,子類可以通過super關(guān)鍵字來顯式地調(diào)用父類的構(gòu)造函數(shù),示例代碼如下:classB{publicB(){System.out.println("constructB");}}classCextendsB{publicC(){super();}}publicclassTest{publicstaticvoidmain(Stringargs[]){newC();}}程序的運(yùn)行結(jié)果為:constructB

super為Java語言的關(guān)鍵字,自定義的方法名不能是super。所以,選項(xiàng)C正確。

20.

以下程序會(huì)打印出______個(gè)“-”。

for(inti=0;i<2;i++)

{

fork();

printf("-\n");

}A.2B.4C.6D.8正確答案:C[解析]要弄明白本題的輸出結(jié)果,就必須弄懂fork函數(shù)的運(yùn)行機(jī)理。

fork()函數(shù)是Unix操作系統(tǒng)下以自身進(jìn)程創(chuàng)建子進(jìn)程的系統(tǒng)調(diào)用,通過系統(tǒng)調(diào)用創(chuàng)建一個(gè)與原來進(jìn)程幾乎完全相同的進(jìn)程,一個(gè)是子進(jìn)程,一個(gè)是父進(jìn)程,該子進(jìn)程擁有與父進(jìn)程相同的堆??臻g,也就是說,兩個(gè)進(jìn)程可以做完全相同的事,可以理解為它們倆是雙胞胎兄弟,但如果初始參數(shù)或者傳入的變量不同,兩個(gè)進(jìn)程也可以做不同的事。在fork()函數(shù)的調(diào)用處,整個(gè)父進(jìn)程空間會(huì)原模原樣地復(fù)制到子進(jìn)程中,包括指令、變量值、程序調(diào)用棧、環(huán)境變量和緩沖區(qū)等。

fork()函數(shù)的一個(gè)奇妙之處就是它僅僅被調(diào)用一次,卻能夠返回兩次,且可能有三種不同的返回值:

1)在父進(jìn)程中,fork()函數(shù)返回新創(chuàng)建子進(jìn)程的進(jìn)程ID。

2)在子進(jìn)程中,fork()函數(shù)返回0。

3)如果出現(xiàn)錯(cuò)誤,fork()函數(shù)返回一個(gè)負(fù)值。

所以,可以通過fork()函數(shù)的返回值來判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。

當(dāng)printf函數(shù)遇到了換行符“\n”,或EOF,或緩沖區(qū)滿,或文件描述符關(guān)閉,或主動(dòng)flush,或程序退出時(shí),就會(huì)把數(shù)據(jù)刷出緩沖區(qū)。對于本題而言,printf("-\n")中有換行,因此會(huì)馬上輸出而不會(huì)緩存,所以,此時(shí)會(huì)打印6個(gè)“-”。

執(zhí)行過程如圖所示。

程序執(zhí)行過程

如果將上述代碼中的printf("-\n")語句改為printf("-")語句,結(jié)果就大相徑庭了。由于printf("-")語句有緩沖區(qū),所以,prinft("-")把字符“-”放到了緩存中,并沒有真正地輸出,在執(zhí)行fork()函數(shù)的時(shí)候,緩存被復(fù)制到子進(jìn)程空間,所以,輸出“-”的個(gè)數(shù)就變?yōu)?個(gè),比6個(gè)多2個(gè)。所以,選項(xiàng)C正確。

所以,本題的答案為C。

如果將printf()和fork()這兩句順序調(diào)換會(huì)怎樣呢?

此時(shí),對于printf("-")的情況,由于“-”在緩沖區(qū)中沒有實(shí)際輸出,所以,printf()函數(shù)和fork()函數(shù)的順序調(diào)換沒有影響,都是8個(gè)。

對于printf("-\n")的情況,因?yàn)橛袑?shí)際輸出調(diào)換順序printf()在前,所以,fork()函數(shù)在后輸出為3個(gè)“-”。

21.

以下關(guān)于Java語言中的引用的描述中,正確的是______。A.引用實(shí)際上就是指針B.引用本身是PrimitiveC.一個(gè)對象只能被一個(gè)引用所指引D.引用就是對象本身正確答案:B[解析]對于選項(xiàng)A,在編程語言中,指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;而引用是某塊內(nèi)存的別名。Java語言中沒有明確的指針定義,但實(shí)質(zhì)上每一個(gè)new語句返回的都是一個(gè)指針的引用,只不過在大多時(shí)候,Java語言并不用關(guān)心如何操作這個(gè)“指針”。雖然引用在底層是通過指針實(shí)現(xiàn)的,但是引用和指針不能等同,例如指針可以執(zhí)行比較運(yùn)算和整數(shù)加減運(yùn)算,而引用卻不行。所以,選項(xiàng)A錯(cuò)誤。

對于選項(xiàng)B,引用本身存儲的對象的地址信息(雖然與指針不是完全相同),而這個(gè)地址信息是存儲在棧中的,在聲明后就會(huì)立刻在棧上給分配存儲空間。在方法調(diào)用傳遞引用的時(shí)候,對形參引用的值本身所做的修改對實(shí)參不可見,因此,從本質(zhì)上來講,引用也是原始數(shù)據(jù)類型(Primitive)。所以,選項(xiàng)B正確。

對于選項(xiàng)C,一個(gè)對象可以被多個(gè)引用同時(shí)指引,例如Strings="abc";Strings1=s;。所以,選項(xiàng)C錯(cuò)誤。

對于選項(xiàng)D,引用只是對象的一個(gè)別名,或理解為對象的地址。所以,選項(xiàng)D錯(cuò)誤。

22.

以下不屬于數(shù)據(jù)庫事務(wù)正確執(zhí)行的四個(gè)基本要素的是______。A.隔離性B.持久性C.強(qiáng)制性D.一致性正確答案:C[解析]本題中,強(qiáng)制性不屬于這四種特性。所以,選項(xiàng)C正確。

23.

下列選項(xiàng)中,提供了Java存取數(shù)據(jù)庫能力的包是______。A.java.sqlB.java.swingC.java.ioD.java.awt正確答案:A[解析]包(package)是Java語言提供的一種區(qū)別類的命名空間的機(jī)制,它是類的組織方式,是一組相關(guān)類和接口的集合,提供了訪問權(quán)限和命名的管理機(jī)制。

在Java語言中,包的作用主要體現(xiàn)在以下三個(gè)方面:

1)方便查找與使用。將功能相近的類放在同一個(gè)包中,可以方便查找與使用。

2)避免命名沖突。由于在不同包中可以存在同名類,所以,使用包的好處是在一定程度上可以避免命名沖突。

3)訪問權(quán)限設(shè)定。某次訪問權(quán)限是以包為單位的。

本題中,對于選項(xiàng)A,java.sql包中主要包含一些訪問數(shù)據(jù)庫相關(guān)的接口。所以,選項(xiàng)A正確。

對于選項(xiàng)B,java.swing是一個(gè)用于開發(fā)Java應(yīng)用程序用戶界面的開發(fā)工具包。所以,選項(xiàng)B錯(cuò)誤。

對于選項(xiàng)C,java.io提供了流處理的相關(guān)接口。所以,選項(xiàng)C錯(cuò)誤。

對于選項(xiàng)D,java.awt包含用于創(chuàng)建用戶界面和繪制圖形圖像的所有類。所以,選項(xiàng)D錯(cuò)誤。

24.

二叉排序樹的定義是:①若它的左子樹不為空,則左子樹所有結(jié)點(diǎn)均小于它的根結(jié)點(diǎn)的值;②若它的右子樹不為空,則右子樹所有結(jié)點(diǎn)的值均大于根結(jié)點(diǎn)的值;③它的左右子樹也分別為二叉排序樹。下列遍歷方式中,能夠得到一個(gè)遞增有序序列的是______。A.前序遍歷B.中序遍歷C.后序遍歷D.廣度遍歷正確答案:B[解析]如果需要得到的序列為遞增序列,按照二叉排序樹的定義,應(yīng)該先訪問左子樹,再訪問根結(jié)點(diǎn),最后訪問右子樹,根據(jù)定義可知,能夠得到一個(gè)遞增有序序列的遍歷方式是為中序遍歷。所以,選項(xiàng)B正確。

25.

在WEB-INF目錄下,必須存放的文件為______。A.class文件B.web.xmlC.html文件D.jar文件正確答案:B[解析]WEB-INF是Web應(yīng)用的安全目錄。所謂安全目錄就是客戶端無法訪問,只有服務(wù)端可以訪問的目錄。如果想在頁面中直接訪問其中的文件,必須通過web.xml文件對要訪問的文件進(jìn)行相應(yīng)的映射才行。WEB-INF文件夾下除了web.xml外,還存在一個(gè)classes文件夾,用以放置*.class文件,這些*.class文件是設(shè)計(jì)人員編寫的類庫,實(shí)現(xiàn)了JSP頁面前臺與后臺服務(wù)的分離,使得網(wǎng)站的維護(hù)非常方便。web.xml文件為網(wǎng)站部署描述XML文件,它對網(wǎng)站的部署非常重要。因此,web.xml是必不可少的文件。所以,選項(xiàng)B正確。

26.

在J2EE中,屬于Web層的組件有______。A.ServletB.HTMLC.AppletD.EJB正確答案:A[解析]J2EE(Java2PlatformEnterpriseEdition)是Java平臺企業(yè)版的簡稱,是用來開發(fā)與部署企業(yè)級應(yīng)用的一個(gè)架構(gòu),它提供了一種統(tǒng)一的、開放標(biāo)準(zhǔn)的多層平臺,該平臺主要由構(gòu)件、服務(wù)和通信三個(gè)模塊構(gòu)成。

構(gòu)件包含客戶端構(gòu)件和服務(wù)端構(gòu)件兩種類型,其中客戶端構(gòu)件主要包含兩類:Applets和ApplicationClients,服務(wù)端構(gòu)件分為兩類:Web構(gòu)件(Servlet與JSP)和EJBs(EnterpriseJavaBeans)。服務(wù)由J2EE平臺提供商實(shí)現(xiàn),分為ServiceAPI(開發(fā)時(shí)使用)和運(yùn)行時(shí)服務(wù)。通信為由容器提供的支持協(xié)作構(gòu)件之間的通信。

從本質(zhì)上來講,J2EE只是一個(gè)行業(yè)標(biāo)準(zhǔn),主要用來通過Java開發(fā)服務(wù)端應(yīng)用提供一個(gè)獨(dú)立的、可移植的、多用戶的企業(yè)級平臺,從而能夠簡化應(yīng)用程序的開發(fā)和部署。正是由于J2EE只是一個(gè)標(biāo)準(zhǔn)而不是一個(gè)成熟的產(chǎn)品,因此,目前有很多不同類型的J2EE服務(wù)器。只要開發(fā)的應(yīng)用程序符合J2EE的標(biāo)準(zhǔn),就都可以部署在遵循了J2EE的開發(fā)標(biāo)準(zhǔn)的J2EE服務(wù)器上。這種標(biāo)準(zhǔn),使得開發(fā)人員只需要專注于各種應(yīng)用系統(tǒng)的商業(yè)邏輯與架構(gòu)設(shè)計(jì),而不用過多地考慮底層繁瑣的程序編寫工作,系統(tǒng)的開發(fā)與部署效率大幅提升。所以,選項(xiàng)A正確。

27.

二進(jìn)制數(shù)11101轉(zhuǎn)化為十進(jìn)制數(shù)是______。A.23B.17C.26D.29正確答案:D[解析]本題中,二進(jìn)制數(shù)11101對應(yīng)的十進(jìn)制數(shù)表示為1*2^0+0*2^1+1*2^2+1*2^3+1*2^4=29,所以,選項(xiàng)D正確。除了人工轉(zhuǎn)換外,在Java語言中,也可以用如下方法把一個(gè)二進(jìn)制數(shù)轉(zhuǎn)換為十進(jìn)制數(shù):Integer.valueOf("11101",2)。

28.

下列標(biāo)識符命名原則中,正確的是______。A.變量和方法名的首寫字母大寫B(tài).類名的首字母小寫C.接口名的首寫字母小寫D.常量完全大寫正確答案:D[解析]Java標(biāo)識符可以是字母、數(shù)字、$或(下劃線),但不可用數(shù)字開頭,且不可以是Java的關(guān)鍵字;標(biāo)識符在語法層面給出了如何定義一個(gè)合法的標(biāo)示符。在實(shí)際使用的時(shí)候?yàn)榱嗽黾映绦虻目勺x性,Java還根據(jù)不同的類型提供了幾個(gè)命名的原則(不是強(qiáng)制的,只是為了增強(qiáng)程序的可讀性,降低程序的維護(hù)成本):

包名:全部小寫(例如mypacket)。

類名:每個(gè)單詞的首字母大寫(例如MyClass)。

變量名:第一個(gè)字母小寫,以后每個(gè)單詞的首字母大寫(例如firstName)。

常量:全部使用大寫字母,單詞間用下劃線隔開(例如MAX_LEN)。

從上面分析可知,選項(xiàng)D正確,選項(xiàng)A和選項(xiàng)B錯(cuò)誤。接口也可以看作一種特殊的類,所以,接口名的首字母也大寫,因此,選項(xiàng)C錯(cuò)誤。

所以,本題的答案為D。

29.

在段頁式存儲管理系統(tǒng)中其虛擬地址空間是______的。A.一維B.二維C.三維D.四維正確答案:C

30.

已知一個(gè)無向圖(邊為正數(shù))中頂點(diǎn)A、B的一條最短路徑P,如果把各個(gè)邊的權(quán)重(即相鄰兩個(gè)頂點(diǎn)的距離)變?yōu)樵瓉淼?倍,那么在新圖中,P仍然是A、B之間的最短路徑。以上說法______。A.不確定B.正確C.錯(cuò)誤正確答案:B[解析]如果從圖中某一頂點(diǎn)(源點(diǎn))到達(dá)另一頂點(diǎn)(終點(diǎn))的路徑可能不止一條,有這樣一條路徑,沿此路徑上各邊的權(quán)值總和(稱為路徑長度)最小,該路徑稱為最短路徑。

本題中,如果將各條邊的權(quán)值按從小到大排序,則權(quán)值乘以2之后的排序不變,也就是權(quán)重的相對關(guān)系不變,p仍是最短路徑。所以,選項(xiàng)B正確。

二、論述題1.

Java中的作用域有哪正確答案:在計(jì)算機(jī)程序中,聲明在不同地方的變量具有不同的作用域,例如局部變量、全局變量等。在Java語言中,作用域是由花括號的位置決定的,它決定了其定義的變量名的可見性與生命周期。

在Java語言中,變量的類型主要有3種:成員變量、靜態(tài)變量和局部變量。類的成員變量的作用范圍與類的實(shí)例化對象的作用范圍相同,當(dāng)類被實(shí)例化時(shí),成員變量就會(huì)在內(nèi)存中分配空間并初始化,直到這個(gè)被實(shí)例化對象的生命周期結(jié)束時(shí),成員變量的生命周期才結(jié)束。被static修飾的成員變量被稱為靜態(tài)變量或全局變量,與成員變量不同的是,靜態(tài)變量不依賴于特定的實(shí)例,而是被所有實(shí)例所共享,也就是說,只要一個(gè)類被加載,JVM就會(huì)給類的靜態(tài)變量分配存儲空間。因此,就可以通過類名和變量名來訪問靜態(tài)變量。局部變量的作用域與可見性為它所在的花括號內(nèi)。

此外,成員變量也有4種作用域,它們的區(qū)別見下表。作用域的對比作用域與可見性當(dāng)前類同一package子類其他packagepublic√√√√private√×××protected√√√×default√√××

1)public。表明該成員變量或方法對所有類或?qū)ο蠖际强梢姷模蓄惢驅(qū)ο蠖伎梢灾苯釉L問。

2)private。表明該成員變量或方法是私有的,只有當(dāng)前類對其具有訪問權(quán)限,除此之外的其他類或者對象都沒有訪問權(quán)限。

3)protected。表明成員變量或方法對該類自身,與它在同一個(gè)包中的其它類,在其它包中的該類的子類都可見。

4)default。表明該成員變量或方法只有自己和與其位于同一包內(nèi)的類可見。若父類與子類位于同一個(gè)包內(nèi),則子類對父類的default成員變量或方法都有訪問權(quán)限;若父類與子類位于不同的package(包)內(nèi),則沒有訪問權(quán)限。

需要注意的是,這些修飾符只能修飾成員變量,不能用來修飾局部變量。private與protected不能用來修飾類(只有public、abstract或final能用來修飾類)。

常見筆試題:

下列說法中,正確的是______

A.實(shí)例方法可直接調(diào)用超類的實(shí)例方法

B.實(shí)例方法可直接調(diào)用超類的類方法

C.實(shí)例方法可直接調(diào)用其他類的實(shí)例方法

D.實(shí)例方法可直接調(diào)用本類的類方法

答案:D。當(dāng)超類的實(shí)例方法或類方法為private時(shí),是不能被子類調(diào)用的。同理,當(dāng)其他類的實(shí)例方法為private時(shí),也不能被直接調(diào)用。

2.

實(shí)現(xiàn)多線程的方法有哪幾種?正確答案:Java虛擬機(jī)(JavaVirtualMachine,JVM,是運(yùn)行所有Java程序的抽象計(jì)算機(jī),是Java語言的運(yùn)行環(huán)境)允許應(yīng)用程序并發(fā)地運(yùn)行多個(gè)線程。在Java語言中,多線程的實(shí)現(xiàn)一般有以下三種方法:

1)實(shí)現(xiàn)Runnable接口,并實(shí)現(xiàn)該接口的run()方法。以下是主要步驟:

①自定義類并實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)run()方法。

②創(chuàng)建Thread對象,用實(shí)現(xiàn)Runnable接口的對象作為參數(shù)實(shí)例化該Thread對象。

③調(diào)用Thread的start()方法。

classMyThreadimplementsRunnable

{//創(chuàng)建線程類

publicvoidrun()

{

System.out.println("Threadbody");

}

}

publicclassTest

{

publicstaticvoidmain(String[]args)

{

MyThreadthread=newMyThread();

Threadt=newThread(thread);

t.start();

//開啟線程

}

2)繼承Thread類,重寫run方法。Thread本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個(gè)實(shí)例,它代表一個(gè)線程的實(shí)例,并且,啟動(dòng)線程的唯一方法就是通過Thread類的start()方法。start()方法是一個(gè)native(本地)方法,它將啟動(dòng)一個(gè)新線程,并執(zhí)行run()方法(Thread中提供的run()方法是一個(gè)空方法)。這種方式通過自定義類直接extendsThread,并重寫run()方法,就可以啟動(dòng)新線程并執(zhí)行自己定義的run()方法。需要注意的是,當(dāng)start()方法調(diào)用后并不是立即執(zhí)行多線程代碼,而是使得該線程變?yōu)榭蛇\(yùn)行態(tài)(Runnable),什么時(shí)候運(yùn)行多線程代碼是由操作系統(tǒng)決定的。

下例給出了Thread的使用方法。

classMyThreadextendsThread

{//創(chuàng)建線程類

publicvoidrun()

{

System.out.println("Threadbody");

//線程的方法體

}

}

publicclassTest

{

publicstaticvoidmain(String[]args)

{

MyThreadthread=newMyThread();

thread.start();

//開啟線程

}

3)實(shí)現(xiàn)Callable接口,重寫call()方法。Callable對象實(shí)際是屬于Executor框架中的功能類,Callable接口與Runnable接口類似,但是提供了比Runnable更強(qiáng)大的功能,主要表現(xiàn)為以下三點(diǎn):

①Callable可以在任務(wù)結(jié)束后提供一個(gè)返回值,Runnable無法提供這個(gè)功能。

②Callable中的call()方法可以拋出異常,而Runnable的run()方法不能拋出異常。

③運(yùn)行Callable可以拿到一個(gè)Future對象,F(xiàn)uture對象表示異步計(jì)算的結(jié)果。它提供了檢查計(jì)算是否完成的方法。由于線程屬于異步計(jì)算模型,所以無法從其他線程中得到方法的返回值,在這種情況下,就可以使用Future來監(jiān)視目標(biāo)線程調(diào)用call()方法的情況,當(dāng)調(diào)用Future的get()方法以獲取結(jié)果時(shí),當(dāng)前線程就會(huì)阻塞,直到call()方法結(jié)束返回結(jié)果。

示例代碼如下:

importjava.util.concurrent.*;

publicclassCallableAndFuture

{

//創(chuàng)建線程類

publicstaticclassCallableTestimplementsCallable<String>

{

publicStringcall()throwsException

{

return"HelloWorld!";

}

}

publicstaticvoidmain(String[]args)

{

ExecutorServicethreadPool=Executors.newSingleThreadExecutor();

//啟動(dòng)線程

Future<String>future=threadPool.submit(newCallableTest());

try

{

System.out.println("waitingthreadtofinish");

System.out.println(future.get());//等待線程結(jié)束,并獲取返回結(jié)果

}

catch(Exceptione)

{

e.printStackTrace();

}

}

}

上述程序的運(yùn)行結(jié)果為:

waitingthreadtofinish

HelloWorid!

在以上三種方式中,前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的。當(dāng)需要實(shí)現(xiàn)多線程時(shí),一般推薦實(shí)現(xiàn)Runnable接口的方式,原因如下:首先,Thread類定義了多種方法可以被派生類使用或重寫,但是只有run方法是必須被重寫的,在run方法中實(shí)現(xiàn)這個(gè)線程的主要功能。這當(dāng)然是實(shí)現(xiàn)Runnable接口所需的同樣的方法。而且,很多Java開發(fā)人員認(rèn)為,一個(gè)類僅在它們需要被加強(qiáng)或修改時(shí)才會(huì)被繼承。因此,如果沒有必要重寫Thread類中的其他方法,那么通過繼承Thread的實(shí)現(xiàn)方式與實(shí)現(xiàn)Runnable接口的效果相同,在這種情況下最好通過實(shí)現(xiàn)Runnable接口的方式來創(chuàng)建線程。

3.

描述Java類加載器的原理及其組織結(jié)構(gòu)。正確答案:Java語言是一種具有動(dòng)態(tài)性的解釋型語言,類只有被加載到JVM中后才能運(yùn)行。當(dāng)運(yùn)行程序時(shí),JVM會(huì)將編譯生成的.class文件按照需求和一定的規(guī)則加載到內(nèi)存中,并組織成為一個(gè)完整的Java應(yīng)用程序。這個(gè)加載過程是由加載器來完成的,具體而言,就是由ClassLoader和它的子類來實(shí)現(xiàn)的。類加載器本身也是一個(gè)類,其實(shí)質(zhì)是把類文件從硬盤讀取到內(nèi)存中。

類的加載方式分為隱式裝載與顯式裝載兩種。隱式裝載指的是程序在使用new等方式創(chuàng)建對象的時(shí)候,會(huì)隱式地調(diào)用類的加載器把對應(yīng)的類加載到JVM中。顯式裝載指的是通過直接調(diào)用class-forName()方法來把所需的類加載到JVM中。

任何一個(gè)工程項(xiàng)目都是由許多個(gè)類組成的,當(dāng)程序啟動(dòng)時(shí),只把需要的類加載到JVM中,其他的類只有被使用到的時(shí)候才會(huì)被加載,采用這種方法,一方面可以加快加載速度,另一方面可以節(jié)約程序運(yùn)行過程中對內(nèi)存的開銷。此外,在Java語言中,每個(gè)類或接口都對應(yīng)一個(gè).class文件,這些文件可以被看成是一個(gè)個(gè)可以被動(dòng)態(tài)加載的單元,因此,當(dāng)只有部分類被修改的時(shí)候,只需要重新編譯變化的類即可,而不需要重新編譯所有的文件,因此,加快了編譯速度。

在Java語言中,類的加載是動(dòng)態(tài)的,它并不會(huì)一次性將所有類全部加載后再運(yùn)行,而是保證程序運(yùn)行的基礎(chǔ)類(例如基類)完全加載到JVM中,至于其他類,則在需要的時(shí)候才加載。在Java語言中,可以把類分為三類:系統(tǒng)類、擴(kuò)展類和自定義類。Java語言針對這三種不同的類提供了三種類型的加載器,這三種加載器的關(guān)系如下:

BootstrapLoader-負(fù)責(zé)加載系統(tǒng)類(jre/lib/rt.jar的類)

|

--ExtClassLoader-負(fù)責(zé)加載擴(kuò)展類(jar/lib/ext/*.jar的類)

|

--AppClassLoader-負(fù)責(zé)加載應(yīng)用類(classpath指定的目錄或jar中的類)

以上這三個(gè)類是怎么協(xié)調(diào)工作來完成類的加載呢?其實(shí),它們是通過委托的方式實(shí)現(xiàn)的。具體而言,就是當(dāng)有類需要被加載時(shí),類裝載器會(huì)請求父類來完成這個(gè)載入工作,父類會(huì)使用其自己的搜索路徑來搜索需要被載入的類,如果搜索不到,才會(huì)由子類按照其搜索路徑來搜索待加載的類。下例可以充分說明加載器的工作原理。

publicclassTestLoader

{

publicstaticvoidmain(String[]args)throwsException

{

//調(diào)用class加載器

ClassLoaderclApp=TestLoader.class.getClassLoader();

System.out.println(clApp);

//調(diào)用上一層Class加載器

ClassLoaderclExt=clApp.getParem();

System.out.println(clExt);

//調(diào)用根部Class加載器

ClassLoaderclBoot=clExt.getParent();

System.out.println(clBoot);

}

}

程序的運(yùn)行結(jié)果為:

sun.misc.Launcher$AppClassLoader@19821f

sun.misc.Launcher$ExtClassLoader@addbf1

null

從上例可以看出,TestLoader類是由AppClassLoader來加載的。另外需要說明的一點(diǎn)是,由于BootstrapLoader是使用C++語言來實(shí)現(xiàn)的,因此,在Java語言中,是看不到它的,此時(shí)程序會(huì)輸出null。

類加載的主要步驟分為以下三步:

1)裝載:根據(jù)查找路徑找到相對應(yīng)的class文件,然后導(dǎo)入。

2)鏈接:鏈接又可以分為三個(gè)小的步驟,具體如下:

①檢查:檢查待加載的class文件的正確性。

②準(zhǔn)備:給類中的靜態(tài)變量分配存儲空間。

③參考解析:將符號引用轉(zhuǎn)換成直接引用(這一步是可選的)。

3)初始化:對靜態(tài)變量和靜態(tài)代碼塊執(zhí)行初始化工作。

4.

什么是設(shè)計(jì)模式?有哪些常見的設(shè)計(jì)模式?正確答案:設(shè)計(jì)模式(DesignPattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式的目的是為了代碼重用,避免程序大量修改,同時(shí)使代碼更容易被他人理解,并且保證代碼可靠性。顯然,設(shè)計(jì)模式不管是對自己還是對他人抑或是對系統(tǒng)都是有益的,設(shè)計(jì)模式使得代碼編制真正地工程化,設(shè)計(jì)模式可以說是軟件工程的基石。

GoF(GangofFour)23種經(jīng)典設(shè)計(jì)模式見下表。GoF經(jīng)典設(shè)計(jì)模式

創(chuàng)建型結(jié)構(gòu)型行為型類FactoryMethod(工廠方法)Adapter_Class(適配器類)Interpreter(解釋器)TemplateMethod(模板方法)對象AbsmactFactory(抽象工廠)Builder(生成器)Prototype(原型)Singleton(單例)Adapter_Object(適配器對象)Bridge(橋接)Composite(組合)Decorator(裝飾)Facade(外觀)Flyweight(享元)Proxy(代理)ChairlofResponsibility(職責(zé)鏈)Command(命令)Iteralor(迭代器)Mediator(中介者)Memento(備忘錄)Observer(觀察者)State(狀態(tài))Swategy(策略)Visitor(訪問者模式)

常見的設(shè)計(jì)模式有工廠模式(FactoryPattern)、單例模式(SingletonPattern)、適配器模式(AdapterPattern)、享元模式(FlyweightPattern)以及觀察者模式(ObserverPattern)等。

工廠模式專門負(fù)責(zé)實(shí)例化有大量公共接口的類。工廠模式可以動(dòng)態(tài)地決定將哪一個(gè)類實(shí)例化,而不必事先知道每次要實(shí)例化哪一個(gè)類??蛻纛惡凸S類是分開的。消費(fèi)者無論什么時(shí)候需要某種產(chǎn)品,需要做的只是向工廠提出請求即可。消費(fèi)者無須修改就可以接納新產(chǎn)品。當(dāng)然也存在缺點(diǎn),就是當(dāng)產(chǎn)品修改時(shí),工廠類也要做相應(yīng)的修改。

工廠模式包含以下幾種形態(tài):

1)簡單工廠(SimpleFactory)模式。簡單工廠模式的工廠類是根據(jù)提供給它的參數(shù),返回幾個(gè)可能產(chǎn)品中的一個(gè)類的實(shí)例,通常情況下它返回的類都有一個(gè)公共的父類和公共的方法。設(shè)計(jì)類圖如圖1所示。

圖1

簡單工廠模式設(shè)計(jì)類圖

其中,Product為待實(shí)例化類的基類,它可以有多個(gè)子類;SimpleFactory類中提供了實(shí)例化Product的方法,這個(gè)方法可以根據(jù)傳入的參數(shù)動(dòng)態(tài)地創(chuàng)建出某一類型產(chǎn)品的對象。

2)工廠方法(FactoryMethod)模式。工廠方法模式是類的創(chuàng)建模式,其用意是定義一個(gè)用于創(chuàng)建產(chǎn)品對象的工廠的接口,而將實(shí)際創(chuàng)建工作推遲到工廠接口的子類中。它屬于簡單工廠模式的進(jìn)一步抽象和推廣。多態(tài)的使用,使得工廠方法模式保持了簡單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。設(shè)計(jì)類圖如圖2所示。

圖2

工廠方法模式設(shè)計(jì)類圖

Product為產(chǎn)品的接口或基類,所有的產(chǎn)品都實(shí)現(xiàn)這個(gè)接口或抽象類(例如ConcreteProduct),這樣就可以在運(yùn)行時(shí)根據(jù)需求創(chuàng)建對應(yīng)的產(chǎn)品類。Creator實(shí)現(xiàn)了對產(chǎn)品所有的操作方法,而不實(shí)現(xiàn)產(chǎn)品對象的實(shí)例化。產(chǎn)品的實(shí)例化由Creator的子類來完成。

3)抽象工廠(AbstractFactory)模式。抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠模式是指當(dāng)有多個(gè)抽象角色時(shí)使用的一種工廠模式,抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體的情況下,創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對象。根據(jù)LSP原則(即Liskov替換原則),任何接受父類型的地方,都應(yīng)當(dāng)能夠接受子類型。因此,實(shí)際上系統(tǒng)所需要的,僅僅是類型與這些抽象產(chǎn)品角色相同的一些實(shí)例,而不是這些抽象產(chǎn)品的實(shí)例。換句話說,

溫馨提示

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

評論

0/150

提交評論