java軟件工程面試題集錦_第1頁
java軟件工程面試題集錦_第2頁
java軟件工程面試題集錦_第3頁
java軟件工程面試題集錦_第4頁
java軟件工程面試題集錦_第5頁
已閱讀5頁,還剩129頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面試題集

面試題集共分為以下十部分:

一、CoreJava:1一95題1一24頁

基礎(chǔ)及語法:1—61題1—13頁

異常:62—69題13—15頁

集合:70—80題15—18頁

線程:81—90題18—21頁

10&Socket:91—95題21—24頁

二、00AD&UML:96一101題24—25頁

三、XML:102—105題26—29頁

四、SQL:106—109題29—31頁

五、JDBC&Hibernate:110一121題31—35頁

六、Web:122—161題35—44頁

七、EJB&Spring:162—179題44—47頁

八、數(shù)據(jù)結(jié)構(gòu)&算法&計算機基礎(chǔ):180—187題47—51頁

九、C++:188—201題51—55頁

十、Weblogic及其它(附加部分)1——13題55—57頁

一、CoreJava部分:(共95題:基礎(chǔ)91道,中等難度4道)

基礎(chǔ)及語法部分:(共61題:基礎(chǔ)60道、中等難度1道)

1、面向?qū)ο蟮奶卣饔心男┓矫??【基礎(chǔ)】

答:面向?qū)ο蟮奶卣髦饕幸韵聝簜€方面:

1)抽象:抽象就是忽略一個主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便

更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,

而只是選擇其中的一部分,暫時不用部分細(xì)節(jié)。抽象包括兩個方面,

一是過程抽象,二是數(shù)據(jù)抽象。

2)繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵類的重用,

它提供了一種明確表述共性的方法。對象的一個新類可以從現(xiàn)有的類

中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為

原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類

可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新

的方法使之更適合特殊的需要。

3)封裝:封裝是把過程和數(shù)據(jù)包圍起來,對數(shù)據(jù)的訪問只能通過已定

義的界面。面向?qū)ο笥嬎闶加谶@個基本概念,即現(xiàn)實世界可以被描繪

成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪

問其他對象。

4)多態(tài)性:多態(tài)性是指允許不同類的對象對同一消息作出響應(yīng)。多態(tài)

性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語言具有靈活、抽象、行

為共享、代碼共享的優(yōu)勢,很好的解決了應(yīng)用程序函數(shù)同名問題。

2、作用域public,private,protected,以及不寫時的區(qū)別?【基礎(chǔ)】

答:區(qū)別如下:

作用域當(dāng)前類同包子孫類其他

publicVVVV

protectedVVVX

defaultVVXX

privateVXXX

不寫時默認(rèn)為defaulto

3、String是最基本的數(shù)據(jù)類型嗎?【基礎(chǔ)】

答:不是。

4、float型floatf=3.4是否正確?【基礎(chǔ)】

答:不正確;精度不準(zhǔn)確,應(yīng)該用強制類型轉(zhuǎn)換,如下所示:float

f=(float)3.4o

5、語句floatf=:L3;編譯能否通過?【基礎(chǔ)】

答:不能;應(yīng)該用強制類型轉(zhuǎn)換,如下所示:floatf=(float)1.3;。

6、shortsi=1;si=si+1;有什么錯?

shortsi=1;si+=1;有什么錯?【基礎(chǔ)】

答:5死心1=1;51=51+1;$1+1運算結(jié)果是屁型,需要強制轉(zhuǎn)換類

型;

shortsi=1;si+=1;可以正確編譯,自動類型提升。

7、Java有沒有g(shù)ot。?【基礎(chǔ)】

答:goto是java中的保留字,現(xiàn)在沒有在java中使用。

8>int和Integer有什么區(qū)別?【基礎(chǔ)】

答:Java提供兩種不同的類型:引用類型和原始類型(或內(nèi)置類型);

int是java的原始數(shù)據(jù)類型,Integer是java為int提供的封裝類。

Java為每個原始類型提供了封裝類:

原始類型:boolean,char,byte,short,int,long,float,double

封裝類型:Boolean,Character,Byte,Short,Integer,Long,Float,

Double

引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引

用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問

題,這種類型以哪種類型的數(shù)據(jù)結(jié)構(gòu)存儲,當(dāng)引用類型和原始類型用

作某個類的實例數(shù)據(jù)時所指定的缺省值。對象引用實例變量的缺省值

為null,而原始類型實例變量的缺省值與它們的類型有關(guān)。

9、&和&&的區(qū)別?【基礎(chǔ)】

答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與

(and)o

10、簡述邏輯操作(&,/)與條件操作(&&,||)的區(qū)別?【基礎(chǔ)】

答:區(qū)別主要有兩點:a.條件操作只能操作布爾型的,而邏輯操作不僅

可以操作

布爾型,而且可以操作數(shù)值型b.邏輯操作不會產(chǎn)生短路。

11、heap和stack有什么區(qū)別?【基礎(chǔ)】

答:棧是一種線形集合,其添加和刪除元素的操作應(yīng)在同一段完成,

棧按照后進(jìn)

先出的方式進(jìn)行處理;堆是棧的一個組成元素。

第3頁共59頁

12、Math.round(11.5)等于多少?Math.round(-11.5)等于多少?【基礎(chǔ)】

答:Math.round(11.5)==12Math.round(-11.5)==-llround方法返回與

參數(shù)

最接近的長整數(shù),參數(shù)加V2后求其floor。

13、swtich是否能作用在byte上,是否能作用在long上,是否能

作用在String

±?【基礎(chǔ)】

答:switch(exprl)中,exprl是一個整數(shù)表達(dá)式。因此傳遞給switch

和case

語句的參數(shù)應(yīng)該是int、short>char或者byte。long,string都不能作

于swticho

14、編程題:用最有效率的方法算出2乘以8等於兒?【基礎(chǔ)】

答:2<<3。

15、有沒有l(wèi)ength。這個方法?String有沒有l(wèi)ength。這個方法?【基

礎(chǔ)】

答:數(shù)組沒有l(wèi)ength。這個方法,有l(wèi)ength的屬性。String有l(wèi)ength()

這個

方法。

16,^JAVA中,如何跳出當(dāng)前的多重嵌套循環(huán)?【基礎(chǔ)】

答:在最外層循環(huán)前加label標(biāo)識,然后用breakdabel方法即可跳出

多重循環(huán)。

17^構(gòu)造器Constructor是否可被。verride?【基礎(chǔ)】

答:構(gòu)造器Constructor不能被繼承,因此不能重寫Overriding,但可

以被重

載Overloadingo

18>兩個對象值相同(x.equals(y)==true),但卻可有不同的hashcode,

句話對不對?【基礎(chǔ)】

答:不對,有相同的hashcode。

19、是否可以繼承String類?【基礎(chǔ)】

答:String類是final類,故不可以繼承。

20^以下二條語句返回值為true的有:

A:“beijing"=="beijing”;

B:“beijing”.equalsIgnoreCase(newString("beijing"));【基(3

答:A和Bo

21、當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對

象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用

傳遞?【基礎(chǔ)】

答:是值傳遞。Java編程語言只有值傳遞參數(shù)。當(dāng)一個對象實例作

為一個參數(shù)被傳遞到方法中時,參數(shù)的值就是對該對象的引用。對象

的內(nèi)容可以在被調(diào)用的方法中改變,但對象的引用是永遠(yuǎn)不會改變

的。

22、我們在web應(yīng)用開發(fā)過程中經(jīng)常遇到輸出某種編碼的字符,如

iso8859-l

等,如何輸出一個某種編碼的字符串?【基礎(chǔ)】

答:publicStringtranslate(Stringstr){

第4頁共59頁

StringtempStr=

try{

tempStr=newString(str.getBytes("ISO-8859-1"),"GBK");

tempStr=tempStr.trim();

}catch(Exceptione){

System.err.println(e.getMessage());

}

returntempStr;

}

23、String和StringBuffer的區(qū)別?【基礎(chǔ)】

答:JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存

和操作字

符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改

變的字符

串。而這個StringBuffer類提供的字符串進(jìn)行修改。當(dāng)你知道字符數(shù)

據(jù)要改變

的時候你就可以使用StringBuffero典型地,你可以使用StringBuffers

來動

態(tài)構(gòu)造字符數(shù)據(jù)。

24、String,StringBufferStringBuilder的區(qū)別。【基礎(chǔ)】

答:String的長度是不可變的;

StringBuffer的長度是可變的,如果你對字符串中的內(nèi)容經(jīng)常進(jìn)

行操作,特別是內(nèi)容要修改時,那么使用StringBuffer,如果最后需要

String,那么使用StringBuffer的toString()方法;線程安全;

StringBuilder是從JDK5開始,為StringBuffer該類補充了一個單

個線程使用的等價類;通常應(yīng)該優(yōu)先使用StringBuilder類,因為它持

所有相同的操作,但由于它不執(zhí)行同步,所以速度更快。

25、Overload和Override的區(qū)別。Overloaded的方法是否可以改變

返回值的類

型?【基礎(chǔ)】

答:方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同

表現(xiàn)。重

寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading

是一個

類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的

名稱和參

數(shù),我們說該方法被重寫(Overriding)。子類的對象使用這個方法時,

將調(diào)用

子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在

一個類中定

義了多個同名的方法,它們或有不同的參數(shù)個數(shù)或有不同的參數(shù)類

型,則稱為方

法的重載(Overloading)。Overloaded的方法是可以改變返回值的類

型。

26、定義類A和類B如下:【基礎(chǔ)】

classA{

inta=l;

doubled=2.0;

voidshow(){

System.out.println("ClassA:a="+a+"\td="+d);

)

)

classBextendsA{

第5頁共59頁

floata=3.0f;

Stringd="Javaprogram.";

voidshow(){

super.show();

System.out.println("ClassB:a="+a+"\td=,,+d);

)

}

(1)若在應(yīng)用程序的main方法中有以下語句:

Aa=newA();

a.show();

則輸出的結(jié)果如何?

(2)若在應(yīng)用程序的main方法中定義類B的對象b:

Ab=newB();

b.show();

則輸出的結(jié)果如何?

答:輸出結(jié)果為:

1)ClassA:a=ld=2.0;

2)ClassA:a=ld=2.0

ClassB:a=3.0d=Javaprogramo

27、描述一下JVM加載class文件的原理機制?【基礎(chǔ)】

答:JVM中類的裝載是由ClassLoader和它的子類來實現(xiàn)的,Java

ClassLoader

是一個重要的Java運行時系統(tǒng)組件。它負(fù)責(zé)在運行時查找和裝入類

文件的類。

28、char型變量中能不能存貯一個中文漢字?為什么?【基礎(chǔ)】

答:能夠定義成為一個中文的,因為java中以unicode編碼,一個

char占16

個字節(jié),所以放一個中文是沒問題的。

29、abstractclass和interface有什么區(qū)別?【基礎(chǔ)】

答:聲明方法的存在而不去實現(xiàn)它的類被叫做抽象類(abstractclass),

它用

于要創(chuàng)建一個體現(xiàn)某些基本行為的類,并為該類聲明方法,但不能在

該類中實現(xiàn)/

該類的情況。不能創(chuàng)建abstract類的實例。然而可以創(chuàng)建一個變量,

其類型是

一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構(gòu)造函數(shù)

或抽象靜態(tài)

方法。Abstract類的子類為它們父類中的所有抽象方法提供實現(xiàn),否

則它們也

是抽象類為。取而代之,在子類中實現(xiàn)該方法。知道其行為的其它類

可以在類中

實現(xiàn)這些方法。接口(interface)是抽象類的變體。新型多繼承性可

通過實現(xiàn)

這樣的接口而獲得。接口中的所有方法都是抽象的,所有成員變量都

是public

staticfinal的。一個類可以實現(xiàn)多個接口,當(dāng)類實現(xiàn)特殊接口時,它

定義(即

將程序體給予)所有這種接口的方法。然后,它可以在實現(xiàn)了該接口

的類的任何

對象上調(diào)用接口的方法。由于有抽象類,它允許使用接口名作為引用

變量的類型。

通常的動態(tài)聯(lián)編將生效。引用可以轉(zhuǎn)換到接口類型或從接口類型轉(zhuǎn)

換,

instanceof運算符可以用來決定某對象的類是否實現(xiàn)了接口。

第6頁共59頁

30^StaticNestedClass^0InnerClass的不同?【基礎(chǔ)】

答:StaticNestedClass是被聲明為靜態(tài)(static)的內(nèi)部類,它可以

不依賴

于外部類實例被實例化。而通常的內(nèi)部類需要在外部類實例化后才能

實例化。

31、java中會存在內(nèi)存泄漏嗎,請簡單描述?!净A(chǔ)】

答:會;存在無用但可達(dá)的對象,這些對象不能被GC回收,導(dǎo)致耗

費內(nèi)存資源。

32>abstract的method是否可同時是static,是否可同時是native,是

否可同

時是synchronized?【基礎(chǔ)】

答:都不能。

33、靜態(tài)變量和實例變量的區(qū)別?【基礎(chǔ)】

答:靜態(tài)變量也稱為類變量,歸全類共有,它不依賴于某個對象,可

通過類名直

接訪問;而實例變量必須依存于某一實例,只能通過對象才能訪問到

它。

34、是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用?【基

礎(chǔ)】

答:不可以,如果其中包含對象的method(),不能保證對象初始化。

35、寫clone。方法時,通常都有一行代碼,是什么?【基礎(chǔ)】

答:Clone有缺省行為:super.clone(),他負(fù)責(zé)產(chǎn)生正確大小的空間,

并逐位

復(fù)制。

36、GC是什么?為什么要有GC?【基礎(chǔ)】

答:GC是垃圾收集的意思(GabageCollection),內(nèi)存處理是編程人

員容易出

現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定

甚至崩潰,

Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自

動回收內(nèi)存的

目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。Java程

序員不用

擔(dān)心內(nèi)存管理,因為垃圾收集器會自動進(jìn)行管理。要請求垃圾收集,

可以調(diào)用下

面的方法之一:System.gc()或Runtime.getRuntime().gc()。

37、垃圾回收的優(yōu)點和原理。并考慮2種回收機制?!净A(chǔ)】

答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使C++程

序員最頭疼

的內(nèi)存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候

不再需要考

慮內(nèi)存管理。由于有個垃圾回收機制,Java中的對象不再有“作用

域”的概念,

只有對象的引用才有“作用域”。垃圾回收可以有效的防止內(nèi)存泄露,

有效的使

用可以使用的內(nèi)存。垃圾回收器通常是作為一個單獨的低級別的線程

運行,不可

預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進(jìn)

行清楚和回

收,程序員不能實時的調(diào)用垃圾回收器對某個對象或所有對象進(jìn)行垃

圾回收?;?/p>

收機制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。

38、垃圾回收器的基本原理是什么?垃圾回收器可以馬上回收內(nèi)存

嗎?有什么辦

法主動通知虛擬機進(jìn)行垃圾回收?【基礎(chǔ)】

答:對于GC來說,當(dāng)程序員創(chuàng)建對象時,GC就開始監(jiān)控這個對象

的地址、大小

以及使用情況。通常,GC采用有向圖的方式記錄和管理堆(heap)中

的所有對象。

通過這種方式確定哪些對象是"可達(dá)的",哪些對象是"不可達(dá)的"。當(dāng)

GC確定一

第7頁共59頁

些對象為"不可達(dá)"時,GC就有責(zé)任回收這些內(nèi)存空間。可以。程序

員可以手動

執(zhí)行System.gc(),通口GC運行,但是Java語言規(guī)范并不保證GC一

定會執(zhí)行。

39^Strings=newString("xyz");創(chuàng)建了幾個StringObject?【基礎(chǔ)】

答:兩個對象,一個是,xyx",一個是指向"xyx"的引用對象s。

40、接口是否可繼承接口?抽象類是否可實現(xiàn)(implements)接口?抽

象類是否可

繼承實體類(concreteclass)?【基礎(chǔ)】

答:接口可以繼承接口。抽象類可以實現(xiàn)(implements)接口,抽象類

可繼承實體

類,但前提是實體類必須有明確的構(gòu)造函數(shù)。

41、Java的接口和C++的虛類的相同和不同處?!净A(chǔ)】

答:由于Java不支持多繼承,而有可能某個類或?qū)ο笠褂梅謩e在

幾個類或?qū)?/p>

象里面的方法或?qū)傩?,現(xiàn)有的單繼承機制就不能滿足要求。與繼承相

比,接口有

更高的靈活性,因為接口中沒有任何實現(xiàn)代碼。當(dāng)一個類實現(xiàn)了接口

以后,該類

要實現(xiàn)接口里面所有的方法和屬性,并且接口里面的屬性在默認(rèn)狀態(tài)

下面都是

publicstatic,所有方法默認(rèn)情況下是public.一個類可以實現(xiàn)多個接口。

42、一個".java”源文件中是否可以包含多個類(不是內(nèi)部類)?有

什么限制?

【基礎(chǔ)】

答:可以;必須只有一個類名與文件名相同。

43、說出一些常用的類,包,接口,請各舉5個?!净A(chǔ)】

答:常用的類:BufferedReaderBufferedWriterFileReaderFileWirter

StringInteger;

常用的包:java.langjava.awtjava.iojava.utiljava.sql;

常用的接口:RemoteListMapDocumentNodeList

44>AnonymousInnerClass(匿名內(nèi)部類)是否可以extends(繼承)其它

類?

是否可以implements(實現(xiàn))interface(接口)?【基礎(chǔ)】

答:可以繼承其他類或?qū)崿F(xiàn)其他接口,在swing編程中常用此方式。

45、內(nèi)部類可以引用他包含類的成員嗎?有沒有什么限制?【基礎(chǔ)】

答:一個內(nèi)部類對象可以訪問創(chuàng)建它的外部類對象的內(nèi)容。

46、java中實現(xiàn)多態(tài)的機制是什么?【基礎(chǔ)】

答:方法的覆蓋Overriding和重載Overloading是java多態(tài)性的不同

表現(xiàn);覆

蓋Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading

是一個

類中多態(tài)性的一種表現(xiàn)。

47、在java中一個類被聲明為final類型,表示了什么意思?【基礎(chǔ)】

答:表示該類不能被繼承,是頂級類。

48、下面哪些類可以被繼承?【基礎(chǔ)】

1)java.Iang.Thread(T)

第8頁共59頁

2)java.lang.Number(T)

3)java.lang.Double(F)

4)java.Iang.Math(F)

5)java.Iang.Void(F)

6)java.Iang.Class(F)

7)java.Iang.ClassLoader(T)

答:1、2、7可以被繼承。

49、指出下面程序的運行結(jié)果:【基礎(chǔ)】

classA{

static{

System.out.print("l");

)

publicA(){

System.out.print("2");

)

)

classBextendsA{

static{

System.out.print("a");

}

publicB(){

System.out.print("b");

}

}

publicclassHello{

publicstaticvoidmain(String[]ars){

Aab=newB();〃執(zhí)行到此處,結(jié)果:la2b

ab=newB();〃執(zhí)行到此處,結(jié)果:Ia2b2b

}

}

答:輸出結(jié)果為la2b2b;糊static代碼段,可以看作是類首次加載(虛

擬機加

載)執(zhí)行的代碼,而對于類加載,首先要執(zhí)行其基類的構(gòu)造,再執(zhí)行其本

身的構(gòu)造。

50、繼承時候類的執(zhí)行順序問題,一般都是選擇題,問你將會打印出什

么?【基礎(chǔ)】

父類:

packagetest;

publicclassFatherClass{

publicFatherClass(){

System.out.println("FatherClassCreate");

}

)

子類:

packagetest;

第9頁共59頁

importtest.FatherClass;

publicclassChildClassextendsFatherClass{

publicChildClass(){

System.out.println("ChildClassCreate");

}

publicstaticvoidmain(String[]args){

FatherClassfc=newFatherClass();

ChildClasscc=newChildClass();

)

)

答:輸出結(jié)果為:

FatherClassCreate

FatherClassCreate

ChildClassCreate

51、內(nèi)部類的實現(xiàn)方式?【基礎(chǔ)】

答:示例代碼如下:

packagetest;

publicclassOuterClass{

privateclassInterClass{

publiclnterClass(){

System.out.println("lnterClassCreate");

}

}

publicOuterClass(){

InterClassic=newlnterClass();

System.out.println("OuterClassCreate");

}

publicstaticvoidmain(String[]args){

OuterClassoc=newOuterClass();

}

)

輸出結(jié)果為:

InterClassCreate

OuterClassCreate

52、關(guān)于內(nèi)部類:【基礎(chǔ)】

publicclassOuterClass{

privatedoubledl=1.0;

//insertcodehere

)

Youneedtoinsertaninnerclassdeclarationatline3,Whichtwo

innerclassdeclarationsarevalid?(Choosetwo.)

A.classlnnerOne{

第10頁共59頁

publicstaticdoublemethoda(){returndl;}

}

B.publicclasslnnerOne{

staticdoublemethoda(){returndl;}

)

C.privateclasslnnerOne{

doublemethoda(){returndl;}

}

D.staticclasslnnerOne{

protecteddoublemethoda(){returndl;}

)

E.abstractclasslnnerOne{

publicabstractdoublemethoda();

)

答:答案為C、E;說明如下:

1)靜態(tài)內(nèi)部類可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員;

故A、B

錯;

2)靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的靜態(tài)變量,而不可訪

問外部類

的非靜態(tài)變量;故D錯;

3)非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量;故C

正確。

53、數(shù)據(jù)類型之間的轉(zhuǎn)換:

1)如何將數(shù)值型字符轉(zhuǎn)換為數(shù)字?

2)如何將數(shù)字轉(zhuǎn)換為字符?

3)如何取小數(shù)點前兩位并四舍五入?【基礎(chǔ)】

答:1)調(diào)用數(shù)值類型相應(yīng)包裝類中的方法parse***(String)或

valueOf(String)

即可返回相應(yīng)基本類型或包裝類型數(shù)值;

2)將數(shù)字與空字符串相加即可獲得其所對應(yīng)的字符串;另外對于基本

類型

數(shù)字還可調(diào)用String類中的valueOf(…)方法返回相應(yīng)字符串,而對于

包裝類型

數(shù)字則可調(diào)用其toString。方法獲得相應(yīng)字符串;

3)^J用該數(shù)字構(gòu)造一java.math.BigDecimal對象,再利用其round。方法

進(jìn)行四舍五入到保留小數(shù)點后兩位,再將其轉(zhuǎn)換為字符串截取最后兩

位。

54、字符串操作:如何實現(xiàn)字符串的反轉(zhuǎn)及替換?【基礎(chǔ)】

答:可用字符串構(gòu)造一StringBuffer對象,然后調(diào)用StringBuffer中的

reverse

方法即可實現(xiàn)字符串的反轉(zhuǎn),調(diào)用replace方法即可實現(xiàn)字符串的替

換。

55、編碼轉(zhuǎn)換:怎樣將GB2312編碼的字符串轉(zhuǎn)換為ISO-8859-1編

碼的字符串?

【基礎(chǔ)】

答:示例代碼如下:

Stringsi="你好";

Strings2=newString(sl.getBytes("GB2312")/"ISO-8859-1");

56、寫一個函數(shù),要求輸入一個字符串和一個字符長度,對該字符串

進(jìn)行分

隔?!净A(chǔ)】

第11頁共59頁

答:函數(shù)代碼如下:

publicString[]split(Stringstr,intchars){

intn=(str.length()+chars-l)/chars;

Stringret[]=newStringfn];

for(inti=0;i<n;i++){

if(i<n-l){

ret[i]=str.substring(i*chars,(i+l)*chars);

}else{

ret[i]=str.substring(i*chars);

}

)

returnret;

}

57、寫一個函數(shù),2個參數(shù),1個字符串,1個字節(jié)數(shù),返回截取的

字符串,要

求字符串中的中文不能出現(xiàn)亂碼:如(“我ABC”,4)應(yīng)該截為“我

AB",輸入(“我

ABC漢DEF",6)應(yīng)該輸出為“我ABC”而不是“我ABC+漢的半個”。

【基礎(chǔ)】

答:代碼如下:

publicStringsubString(Stringstr,intsubBytes){

intbytes=0;//用來存儲字符串的總字節(jié)數(shù)

for(inti=0;i<str.length();i++){

if(bytes==subBytes){

returnstr.substring(O,i);

}

charc=str.charAt(i);

if(c<256){

bytes+=1;//英文字符的字節(jié)數(shù)看作1

}else{

bytes+=2;//中文字符的字節(jié)數(shù)看作2

if(bytes-subBytes==1){

returnstr.substring(O,i);

}

}

}

returnstr;

}

58、日期和時間:

1)如何取得年月日、小時分秒?

2)如何取得從1970年到現(xiàn)在的毫秒數(shù)?

3)如何取得某個日期是當(dāng)月的最后一天?

4)如何格式化日期?【基礎(chǔ)】

答:1)創(chuàng)建java.util.Calendar實例(Calendar.getlnstance。),調(diào)用其get()

方法傳入不同的參數(shù)即可獲得參數(shù)所對應(yīng)的值,如:

第12頁共59頁

calendar.get(Calendar.YEAR);〃獲得年

2)以下方法均可獲得該毫秒數(shù):

Calendar.getlnstance().getTimelnMillis();

System.currentTimeMillis();

3)示例代碼如下:

Calendartime=Calendar.getlnstance();

time.set(Calendar.DAY_OF_MONTH/

time.getActualMaximum(Calendar.DAY_OF_MONTH));

4)利用java.text.DataFormat類中的format。方法可將日期格式化。

59、Java編程,打印昨天的當(dāng)前時刻。【基礎(chǔ)】

答:publicclassYesterdayCurrent{

publicstaticvoidmain(String[]args){

Calendarcal=Calendar.getlnstance();

cal.add(Calendar.DATE,-1);

System.out.println(cal.getTime());

)

}

60>java和javasciprt的區(qū)別?!净A(chǔ)】

答:JavaScript與Java是兩個公司開發(fā)的不同的兩個產(chǎn)品。Java是

SUN公司推

出的新一代面向?qū)ο蟮某绦蛟O(shè)計語言,特別適合于Internet應(yīng)用程序

開發(fā);而

JavaScript是Netscape公司的產(chǎn)品,其目的是為了擴展Netscape

Navigator

功能,而開發(fā)的一種可以嵌入Web頁面中的基于對象和事件驅(qū)動的

解釋性語言,

它的前身是LiveScript;而Java的前身是Oak語言。下面對兩種語言

間的異

同作如下比較:

1)基于對象和面向?qū)ο螅?/p>

Java是一種真正的面向?qū)ο蟮恼Z言,即使是開發(fā)簡單的程序,必須

設(shè)計對象;

JavaScript是種腳本語言,它可以用來制作與網(wǎng)絡(luò)無關(guān)的,與用戶交

互作用

的復(fù)雜軟件。它是一種基于對象(ObjectBased)和事件驅(qū)動(Event

Driver)

的編程語言。因而它本身提供了非常豐富的內(nèi)部對象供設(shè)計人員使

用;

2)解釋和編譯:

Java的源代碼在執(zhí)行之前,必須經(jīng)過編譯;

JavaScript是一種解釋性編程語言,其源代碼不需經(jīng)過編譯,由瀏覽

器解釋

執(zhí)行;

3)強類型變量和類型弱變量:

Java采用強類型變量檢查,即所有變量在編譯之前必須作聲明;

JavaScript中變量聲明,采用其弱類型。即變量在使用前不需作聲明,

而是

解釋器在運行時檢查其數(shù)據(jù)類型;

4)代碼格式不一樣。

61、什么時候用assert?【中等難度】

答:assertion(斷言)在軟件開發(fā)中是一種常用的調(diào)試方式,很多開發(fā)

語言中都

支持這種機制。一般來說,assertion用于保證程序最基本、關(guān)鍵的

正確性。

assertion檢查通常在開發(fā)和測試時開啟。為了提高性能,在軟件發(fā)

布后,

第13頁共59頁

assertion檢查通常是關(guān)閉的。在實現(xiàn)中,斷言是一個包含布爾表達(dá)

式的語句,

在執(zhí)行這個語句時假定該表達(dá)式為true;如果表達(dá)式計算為false,那

么系統(tǒng)

會報告一個Assertionerroro

斷言用于調(diào)試目的:

assert(a>0);//throwsanAssertionerrorifa<=0

斷言可以有兩種形式:

assertExpressionl;

assertExpressionl:Expression2;

Expressionl應(yīng)該總是產(chǎn)生一個布爾值。

Expression2可以是得出一個值的任意表達(dá)式;這個值用于生成顯示

更多調(diào)

試信息的String消息。

斷言在默認(rèn)情況下是禁用的,要在編譯時啟用斷言,需使用source1.4

標(biāo)記:

javac-source1.4Test.java

要在運行時啟用斷言,可使用-enableassertions或者-ea標(biāo)記。

要在運行時選擇禁用斷言,可使用-da或者-disableassertions標(biāo)記。

要在系統(tǒng)類中啟用斷言,可使用-esa或者-dsa標(biāo)記。還可以在包的

基礎(chǔ)上

啟用或者禁用斷言??梢栽陬A(yù)計正常情況下不會到達(dá)的任何位置上放

置斷言。斷

言可以用于驗證傳遞給私有方法的參數(shù)。不過,斷言不應(yīng)該用于驗證

傳遞給公有

方法的參數(shù),因為不管是否啟用了斷言,公有方法都必須檢查其參數(shù)。

不過,既

可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。

另外,斷言

不應(yīng)該以任何方式改變程序的狀態(tài)。

異常部分:(共8題:基礎(chǔ)8道)

62、Java中的異常處理機制的簡單原理和應(yīng)用?【基礎(chǔ)】

答:當(dāng)JAVA程序違反了JAVA的語義規(guī)則時,JAVA虛擬機就會將發(fā)

生的錯誤表

示為一個異常。違反語義規(guī)則包括2種情況。一種是JAVA類庫內(nèi)置

的語義檢查。

例如數(shù)組下標(biāo)越界,會引發(fā)IndexOutOfBoundsException;訪問null的對

象時會

弓I發(fā)NullPointerException。另一種情況就是JAVA允許程序員擴展這

種語義檢

查,程序員可以創(chuàng)建自己的異常,并自由選擇在何時用throw關(guān)鍵

字引發(fā)異常。

所有的異常都是java.Iang.Thowable的子類。

63、error和exception有什么區(qū)別?【基礎(chǔ)】

答:error表示系統(tǒng)級的錯誤和程序不必處理的異常,是恢復(fù)不是不

可能但很困

難的情況下的一種嚴(yán)重問題;比如內(nèi)存溢出,不可能指望程序能處理

這樣的情況;

exception表示需要捕捉或者需要程序進(jìn)行處理的異常,是一種設(shè)計

或?qū)崿F(xiàn)

問題;也就是說,它表示如果程序運行正常,從不會發(fā)生的情況。

64、try{}里有一個return語句,那么緊跟在這個try后的finally{}里

的code

會不會被執(zhí)行,什么時候被執(zhí)行,在return前還是后?【基礎(chǔ)】

答:會執(zhí)行,在return前執(zhí)行。

65、JAVA語言如何進(jìn)行異常處理,關(guān)鍵字:

throws,throw,try,catch,finally

分別代表什么意義?在try塊中可以拋出異常嗎?【基礎(chǔ)】

答:Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)

行分類,并

第14頁共59頁

提供了良好的接口。在Java中,每個異常都是一個對象,它是

Throwable類或

其它子類的實例。當(dāng)一個方法出現(xiàn)異常后便拋出一個異常對象,該對

象中包含有

異常信息,調(diào)用這個對象的方法可以捕獲到這個異常并進(jìn)行處理。

Java的異常

處理是通過5個關(guān)鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。

般情況下是用try來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出

(throws)一個

異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)

由缺

省處理器來處理;

try用來指定一塊預(yù)防所有“異?!钡某绦颍?/p>

catch子句緊跟在try塊后面,用來指定你想要捕捉的“異?!钡念?/p>

型;

throw語句用來明確地拋出一個“異?!?;

throws用來標(biāo)明一個成員函數(shù)可能拋出的各種“異?!?;

Finally為確保一段代碼不管發(fā)生什么“異?!倍急粓?zhí)行一段代碼;

可以在一個成員函數(shù)調(diào)用的外面寫一個try語句,在這個成員函數(shù)內(nèi)

部寫另一

個try語句保護其他代碼。每當(dāng)遇到一個try語句,“異?!钡目蚣?/p>

就放到堆棧

上面,直到所有的try語句都完成。如果下一級的try語句沒有對某

種“異?!?/p>

進(jìn)行處理,堆棧就會展開,直到遇到有處理這種“異?!钡膖ry語句。

66、運行時異常與一般異常有何異同?【基礎(chǔ)】

答:異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表

示虛擬機的

通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求

方法必須

聲明拋出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被

捕獲的運行

時異常。

67、給我一個你最常見到的runtimeexception?【基礎(chǔ)】

答:ArithmeticException,ArrayStoreException,BufferOverflowException,

BufferllnderflowException,CannotRedoException,

CannotUndoException,

ClassCastException,CMMException,ConcurrentModificationException,

DOMException,EmptyStackException,HlegalArgumentException,

HlegalMonitorStateException,HlegalPathStateException,

HlegalStateException,ImagingOpException,IndexOutOfBoundsException,

MissingResourceException,NegativeArraySizeException,

NoSuchElementException,NullPointerException,ProfileDataException,

ProviderException,RasterFormatException,SecurityException,

SystemException,UndeclaredThrowableException,

UnmodifiableSetException,UnsupportedOperationException

68final,finally,finalize的區(qū)別?【基礎(chǔ)】

答:final:修飾符(關(guān)鍵字);如果一個類被聲明為final,意味著它

不能再

派生出新的子類,不能作為父類被繼承,因此一個類不能既被聲明為

abstract

的,又被聲明為final的;將變量或方法聲明為final,可以保證它們

在使用中

不被改變;被聲明為final的變量必須在聲明時給定初值,而在以后

的引用中只

能讀取,不可修改;被聲明為final的方法也同樣只能使用,不能重

載。

finally:再異常處理時提供finally塊來執(zhí)行任何清除操作;如果拋出

個異常,那么相匹配的catch子句就會執(zhí)行,然后控制就會進(jìn)入finally

塊(如

果有的話)。

第15頁共59頁

finalize:方法名;Java技術(shù)允許使用finalize。方法在垃圾收集器將

對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收

集器在確定

這個對象沒有被引用時對這個對象調(diào)用的。它是在Object類中定義

的,因此所

有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)

行其他清

理工作。finalize。方法是在垃圾收集器刪除對象之前對這個對象調(diào)用

的。

69、類ExampleA繼承Exception,類ExampleB繼承ExampleA;【基

礎(chǔ)】

有如下代碼片斷:

try(

thrownewExampleB(ubv);

}catch(ExampleAe){

System.out.printfln("ExampleA");

}catch(Exceptione){

System.out.printfln("Exception");

}

輸出的內(nèi)容應(yīng)該是:

A:ExampleAB:ExceptionC:bD:無

答:輸出為A。

集合部分:(共11題:基礎(chǔ)11道)

70、介紹JAVA中的CollectionFramework(及如何寫自己的數(shù)據(jù)結(jié)構(gòu))

【基礎(chǔ)】

答:CollectionFrameWork如下:

Collection

pList

I(-LinkedList

IpArrayList

|LVector

|LStack

LSet

Map

(-Hashtable

pHashMap

LWeakHashMap

Collection是最基本的集合接口,一個Collection代表一組Object,

Collection的元素(Elements);Map提供key到value的映射。

71、List,Set,Map是否繼承自Collection接口?【基礎(chǔ)】

答:List,Set是;Map不是。

72、你所知道的集合類都有哪些?主要方法?【基礎(chǔ)】

答:最常用的集合類是List和Map。List的具體實現(xiàn)包括ArrayList和

Vector,它們是可變大小的列表,比較適合構(gòu)建、存儲和操作任何類

型對象的元

素列表。List適用于按數(shù)值索引訪問元素的情形。Map提供了一個

更通用的

第16頁共59頁

元素存儲方法。Map集合類用于存儲元素對(稱作“鍵”和“值”),

其中每

個鍵映射到一個值。

73、說出ArrayList,Vector,LinkedList的存儲性能和特性?【基礎(chǔ)】

答:ArrayList和Vector都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)

大于實際

存儲的數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,

但是插入元

素要涉及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,

Vector由

于使用了synchronized方法(線程安全),通常性能上較ArrayList差,

LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進(jìn)行前向或

后向遍歷,

但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入速度較快。

74、Collection和Collections的區(qū)別?【基礎(chǔ)】

答:Collection是java.util下的接口,它是各種集合的父接口,繼承

于它的

接口主要有Set和List;Collections是個java.util下的類,是針對集

合的

幫助類,提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安

全化等操作。

75、HashMap和Hashtable的區(qū)別?【基礎(chǔ)】

答:二者都實現(xiàn)了Map接口,是將惟一鍵映射到特定的值上;主要

區(qū)別在于:

l)HashMap沒有排序,允許一個null鍵和多個null值,而Hashtable

不允許;

2)HashMap把Hashtable的contains方法去掉了,改成containsvalue

containsKey,因為contains方法容易讓人引起誤解;

3)Hashtable繼承自Dictionary類,HashMap是Java1.2引進(jìn)的Map

接口的實現(xiàn);

4)Hashtable的方法是Synchronize的,而HashMap不是,在多個線

程訪問

Hashtable時,不需要自己為它的方法實現(xiàn)同步,而HashMap就必

須為之提供外

同步。

Hashtable和HashMap采用的hash/rehash算法大致一樣,所以性能

不會有很

大的差異。

76、Arraylist與Vector區(qū)別?【基礎(chǔ)】

答:就ArrayList與Vector主要從二方面來說:

1)同步性:Vector是線程安全的(同步),而ArrayList是線程序不

安全的;

2)數(shù)據(jù)增長:當(dāng)需要增長時,Vector默認(rèn)增長一倍,而ArrayList卻是

一半。

77、List、Map、Set三個接口,存取元素時,各有什么特點?【基礎(chǔ)】

答:List以特定次序來持有元素,可有重復(fù)元素。Set無法擁有重復(fù)

元素,內(nèi)部

排序。Map保存key-value值,value可多值。

78、Set里的元素是不能重復(fù)的,那么用什么方法來區(qū)分重復(fù)與否呢?

是用==還

是equals。?它們有何區(qū)別?【基礎(chǔ)】

答:Set里的元素是不能重復(fù)的,用equals()方法來區(qū)分重復(fù)與否。

覆蓋

equals。方法用來判斷對象的內(nèi)容是否相同,而"=="判斷地址是否

相等,用來

決定引用值是否指向同一對象。

79、用程序給出隨便大小的10個數(shù),序號為1-10,按從小到大順序

輸出,并輸

出相應(yīng)的序號?!净A(chǔ)】

第17頁共59頁

答:代碼如下:

packagetest;

importjava.util.ArrayList;

importjava.util.Collections;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Random;

publicclassRandomSort{

publicstaticvoidprintRandomBySort(){

Randomrandom=newRandom();//創(chuàng)建隨機數(shù)生成器

Listlist=newArrayList();

//生成10個隨機數(shù),并放在集合list中

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

list.add(random.nextlnt(1000));

)

Collections.sort(list);//對集合中的元素進(jìn)行排序

Iteratorit=list.iterator();

intcount=0;

while(it.hasNext()){//順序輸出排序后集合中的元素

System.out.println(++count+":"+it.next());

}

)

publicstaticvoidmain(String[]args){

printRandomBySort();

}

}

80、用JAVA實現(xiàn)一種排序,JAVA類實現(xiàn)序列化的方法?在

COLLECTION框架中,

實現(xiàn)比較要實現(xiàn)什么樣的接口?【基礎(chǔ)】

答:用插入法進(jìn)行排序代碼如下:

packagetest;

importjava.util.*;

classInsertSort{

ArrayListal;

publiclnsertSort(intnumjntmod){

al=newArrayList(num);

Randomrand=newRandom();

System.out.printlnf'TheArrayListSortBefore:");

for(inti=0;i<num;i++){

al.add(newlnteger(Math.abs(rand.nextlnt())%mod+

D);

System.out.println("al["+i+"]="+al.get(i));

}

)

第18頁共59頁

publicvoidSortlt(){

templnt;

intMaxSize=l;

for(inti=l;i<al.size();i++){

templnt=(Integer)al.remove(i);

if(Value()>=

((lnteger)al.get(MaxSize-l)).intValue()){

al.add(MaxSize,templnt);

MaxSize++;

System.out.println(al.toStringO);

}else{

for(intj=O;j<MaxSize;j++){

if(((lnteger)al.get(j)),intValue()

>=Value()){

al.add(j,templnt);

MaxSize++;

System.out.println(al.toString());

break;

}

}

)

}

System.out.println("TheArrayListSortAfter:");

for(inti=O;i<al.size();i++){

System.out.println("al["+i+"]="+al.get(i));

}

}

publicstaticvoidmain(String[]args){

InsertSortis=newlnsertSort(10,100);

is.Sortlt();

}

}

JAVA類實現(xiàn)序例化的方法是實現(xiàn)java.io.Serializable接口;

Collection框架中實現(xiàn)比較要實現(xiàn)Comparable接口和Comparator接

口。

線程部分:(共10題:基礎(chǔ)7道,中等難度3道)

81、sleep()和wait()有什么區(qū)別?【基礎(chǔ)】

答:sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時

間,給執(zhí)行

機會給其他線程,但是監(jiān)控狀態(tài)依然保持,到時后會自動恢復(fù)。調(diào)用

sleep不會

釋放對象鎖。wait是Object類的方法,對此對象調(diào)用wait方法導(dǎo)

致本線程放

棄對象鎖,進(jìn)入等待此對象的等待鎖定池,只有針對此對象發(fā)出notify

方法(或

notifyAII)后本線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運行狀態(tài)。

第19頁共59頁

82、當(dāng)一個線程進(jìn)入一個對象的一個synchronized方法后,其它線程

是否可進(jìn)

入此對象的其它方法?【基礎(chǔ)】

答:其它線程只能訪問該對象的其它非同步方法,同步方法則不能進(jìn)

入。

83、請說出你所知道的線程同步的方法。【基礎(chǔ)】

答:wait。:使一個線程處于等待狀態(tài),并且釋放所持有的對象的lock;

sleep。:使一個正在運行的線程處于睡眠狀態(tài),是一個靜態(tài)方法,調(diào)用

此方

法要捕捉InterruptedException異常;

notify。:喚醒一個處于等待狀態(tài)的線程,注意的是在調(diào)用此方法的時

候,

并不能確切的喚醒某一個等待狀態(tài)的線程,而是由JVM確定喚醒哪

個線程,而且

不是按優(yōu)先級;

notityAII():喚醒所有處入等待狀態(tài)的線程,注意并不是給所有喚醒線

程一

個對象的鎖,而是讓它們競爭。

84、多線程有幾種實現(xiàn)方法,都是什么?同步有幾種實現(xiàn)方法,都是什么?

【基礎(chǔ)】

答:多線程有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable

接口洞步

的實現(xiàn)方面有兩種,分別是synchronized,wait與notify。

85、同步和異步有何異同,在什么情況下分別使用他們?舉例說明。

【基礎(chǔ)】

答:如果數(shù)據(jù)將在線程間共享。例如正在寫的數(shù)據(jù)以后可能被另一個

線程讀到,

或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個線程寫過了,那么這些數(shù)據(jù)就是

共享數(shù)據(jù),

必須進(jìn)行同步存取。當(dāng)應(yīng)用程序在對象上調(diào)用了一個需要花費很長時

間來執(zhí)行的

方法,并且不希望讓程序等待方法的返回時,就應(yīng)該使用異步編程,

在很多情況

下采用異步途徑往往更有效率。

86、啟動一個線程是用run()還是start。?【基礎(chǔ)】

答:啟動一個線程是調(diào)用start。方法,使線程所代表的虛擬處理機處

于可運行

狀態(tài),這意味著它可以由JVM調(diào)度并執(zhí)行。這并不意味著線程就會

立即運行。

run()方法可以產(chǎn)生必須退出的標(biāo)志來停止一個線程。

87、線程的基本概念、線程的基本狀態(tài)以及狀態(tài)之間的關(guān)系?【基礎(chǔ)】

答:線程指在程序執(zhí)行過程中,能夠執(zhí)行程序代碼的一個執(zhí)行單位,

每個程序至

少都有一個線程,也就是程序本身;

Java中的線程有四種狀態(tài)分別是:運行、就緒、掛起、結(jié)束。

88、簡述synchronized^0java.util.concurrent.locks.Lock的異同?【中

難度】

答:主要相同點:Lock能完成synchronized所實現(xiàn)的所有功能;

主要不同點:Lock有比synchronized更精確的線程語義和更好的性

能。

synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并

且必須在

finally從句中釋放。

89Java中有幾種方法可以實現(xiàn)一個線程?用什么關(guān)鍵字修飾同步方

法?

stop()和suspend。方法為何不推薦使用?【中等難度】

答:有兩種實現(xiàn)方法,分別是繼承Thread類與實現(xiàn)Runnable接口;

第20頁共59頁

用synchronized關(guān)鍵字修飾同步方法;

反對使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,

且如果對象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查

和修改它

們。結(jié)果很難檢查出真正的問題所在;

suspend。方法容易發(fā)生死鎖。調(diào)用suspend。的時候,目標(biāo)線程會停

下來,

但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問

鎖定的資源,

除非被“掛起”的線程恢復(fù)運行。對任何線程來說,如果它們想恢復(fù)

目標(biāo)線程,

同時又試圖使用任何一個鎖定的資源,就會造成死鎖。故不應(yīng)該使用

suspend(),

而應(yīng)在自己的Thread類中置入一個標(biāo)志,指出線程應(yīng)該活動還是掛

起。若標(biāo)志

指出線程應(yīng)該掛起,便用wait。命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程

應(yīng)當(dāng)恢復(fù),

則用一個notify。重新啟動線程。

90、設(shè)計4個線程,其中兩個線程每次對j增加1,另兩個線程對j每

次減少1;

寫出程序?!局械入y度】

答:以下程序使用內(nèi)部類實現(xiàn)線程,對j增減的時候沒有考慮順序問

題:

publicclassTestThread{

privateintj;

publicTestThread(intj){this.j=j;}

privatesynchronizedvoidinc(){

j++;

System.out.println(j+"--Inc-"+

Thread.currentThread().getName());

}

privatesynchronizedvoiddec(){

j--;

System.out.println(j+"--Dec-"+

Thread.currentThread().getName());

}

publicvoidrun(){

(newDec()).start();

newThread(newlnc()).start();

(newDec()).start();

newThread(newlnc()).start();

}

classDecextendsThread{

publicvoidrun(){

for(inti=0;i<100;i++){

dec();

溫馨提示

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

評論

0/150

提交評論