Java面試題集

java面試題集

XX-12-18 16:27:11

第一,談談final, finally, finalize的區別。
final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。

第二,anonymous inner class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?
可以繼承其他類或完成其他接口,在swing編程中常用此方式。

第三,static nested class 和 inner class的不同,說得越多越好(面試題有的很籠統)。
static nested class是被聲明為靜態(static)的內部類,它可以不依賴於外部類實例被實例化。而通常的內部類需要在外部類實例化後才能實例化。

第四,%26和%26%26的區別。
%26是位運算符,表示按位與運算,%26%26是邏輯運算符,表示邏輯與(and).

第五,hashmap和hashtable的區別。
hashmap是hashtable的輕量級實現(非執行緒安全的實現),他們都完成了map接口,主要區別在於hashmap允許空(null)鍵值(key),由於非執行緒安全,效率上可能高於hashtable.



第六,collection 和 collections的區別。
collection是集合類的上級接口,繼承與他的接口主要有set 和list.
collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜尋、排序、執行緒安全化等操作。

第七,什麼時候用assert。
1.4新增關鍵字(語法),用於測試boolean表達式狀態,可用於調試程式。
使用方法 assert ,表示如果表達式為真(true),則下面的語句執行,否則拋出assertionerror。
另外的使用方式assert %26lt; boolean表達式%26gt;:,表示如果表達式為真,後面的表達式忽略,否則後面表達式的值用於assertionerror的構建參數。
注意編譯時要增加-source 1.4 參數,否則報錯。]運行時要增加 -ea參數,否則assert行被忽略

第八,gc是什麼? 為什麼要有gc?
gc是垃圾收集的意思(gabage collection),記憶體處理是編程人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,java提供的gc功能可以自動監測對象是否超過作用域從而達到自動回收記憶體的目的,java語言沒有提供釋放已分配記憶體的顯示操作方法。

第九,string s = new string("xyz");創建了幾個string object?
兩個

第十,math.round(11.5)等於多少? math.round(-11.5)等於多少?
math.round(11.5)==12
math.round(-11.5)==-11
round方法返回與參數最接近的長整數,參數加1/2後求其floor.

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯?
short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)
short s1 = 1; s1 += 1;(可以正確編譯)

第十二,sleep() 和 wait() 有什麼區別?
sleep是執行緒類(thread)的方法,導致此執行緒暫停執行指定時間,給執行機會給其他執行緒,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。
wait是object類的方法,對此對象調用wait方法導致本執行緒放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyall)後本執行緒才進入對象鎖定池準備獲得對象鎖進入運行狀態。

第十三,java有沒有goto?
沒有
很十三的問題,如果哪個面試的問到這個問題,我勸你還是別進這家公司。

第十四,數組有沒有length()這個方法? string有沒有length()這個方法?
數組沒有length()這個方法,有length的屬性。

 


string有有length()這個方法。

第十五,overload和override的區別。overloaded的方法是否可以改變返回值的類型?
方法的重寫overriding和重載overloading是java多態性的不同表現。重寫overriding是父類與子類之間多態性的一種表現,重載overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"禁止"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(overloading)。overloaded的方法是可以改變返回值的類型。

第十六,set里的元素是不能重複的,那么用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?
set里的元素是不能重複的,那么用iterator()方法來區分重複與否。equals()是判讀兩個set是否相等。
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

第十七,給我一個你最常見到的runtime exception。
arithmeticexception, arraystoreexception, bufferoverflowexception, bufferunderflowexception, cannotredoexception, cannotundoexception, classcastexception, cmmexception, concurrentmodificationexception, domexception, emptystackexception, illegalargumentexception, illegalmonitorstateexception, illegalpathstateexception, illegalstateexception,

 

imagingopexception, indexoutofboundsexception, missingresourceexception, negativearraysizeexception, nosuchelementexception, nullpointerexception, profiledataexception, providerexception, rasterformatexception, securityexception, systemexception, undeclaredthrowableexception, unmodifiablesetexception, unsupportedoperationexception

第十八,error和exception有什麼區別?
error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況。

exception 表示一種設計或實現問題。也就是說,它表示如果程式運行正常,從不會發生的情況。

第十九,list, set, map是否繼承自collection接口?
list,set是
map不是

第二十,abstract class和interface有什麼區別?
聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行為的類,並為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變數,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函式或抽象靜態方法。abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程式體。接口只可以定義static final成員變數。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程式體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作為引用變數的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
都不能

第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函式。

第二十三,啟動一個執行緒是用run()還是start()?
啟動一個執行緒是調用start()方法,使執行緒所代表的虛擬處理機處於可運行狀態,這意味著它可以由jvm調度並執行。這並不意味著執行緒就會立即運行。run()方法可以產生必須退出的標誌來停止一個執行緒。

 


第二十四,構造器constructor是否可被override?
構造器constructor不能被繼承,因此不能重寫overriding,但可以被重載overloading。

第二十五,是否可以繼承string類?
string類是final類故不可以繼承。

第二十六,當一個執行緒進入一個對象的一個synchronized方法後,其它執行緒是否可進入此對象的其它方法?
不能,一個對象的一個synchronized方法只能由一個執行緒訪問。

第二十七,try {}里有一個return語句,那么緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return前執行。


第二十八,編程題: 用最有效率的方法算出2乘以8等於幾?
有c背景的程式設計師特別喜歡問這種問題。
2 %26lt;%26lt; 3

第二十九,兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?
不對,有相同的hash code。

第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那么這裡到底是值傳遞還是引用傳遞?
是值傳遞。java 程式語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在string上?
switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte。long,string 都不能作用於swtich。

第三十二,編程題: 寫一個singleton出來。
singleton模式主要作用是保證在java應用程式中,一個類class只有一個實例存在。
一般singleton模式通常有幾種種形式:
第一種形式: 定義一個類,它的構造函式為private的,它有一個static的private的該類變數,在類初始化時實例話,通過一個public的getinstance方法獲取對它的引用,繼而調用其中的方法。
public class singleton {
private singleton(){}
//在自己內部定義自己一個實例,是不是很奇怪?
//注意這是private 只供內部調用
private static singleton instance = new singleton();
//這裡提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static singleton getinstance() {
return instance;
}
}
第二種形式:
public class singleton {
private static singleton instance = null;
public static synchronized singleton getinstance() {
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次   
//使用時生成實例,提高了效率!
if (instance==null)
instance=new singleton();
return instance; }
}
其他形式:
定義一個類,它的構造函式為private的,所有方法為static的。
一般認為第一種形式要更加安全些