找工作要面試,有面試就有對(duì)付面試的辦法。以下一些題目來(lái)自我和我朋友痛苦的面試經(jīng)歷,提這些問(wèn)題的公司包括IBM, E*Trade, Siebel,Motorola, SUN,以及其它大小公司。
面試是沒(méi)什么道理可講的,它的題目有的不合情理、脫離實(shí)際。有在紙上寫的,有當(dāng)面考你的,也有在電話里問(wèn)的,給你IDE的估計(jì)很少(否則你趕快去買彩票,說(shuō)不定中)。所以如果你看完此文后,請(qǐng)不要抱怨說(shuō)這些問(wèn)題都能用IDE來(lái)解決。你必須在任何情況下準(zhǔn)確回答這些問(wèn)題,在面試中如果出現(xiàn)一兩題回答不準(zhǔn)確很有可能你就被拒之門外了。
當(dāng)然這些都是Java的基本題,那些面試的人大多數(shù)不會(huì)問(wèn)你Hibernate有多先進(jìn),Eclipse的三個(gè)組成部分,或command design pattern,他們都是老一輩了,最喜歡問(wèn)的就是基礎(chǔ)知識(shí)。別小看了這些基礎(chǔ),我朋友水平一流,結(jié)果就栽在一到基礎(chǔ)知識(shí)的問(wèn)題下,和高薪無(wú)緣。
好了廢話少說(shuō),開(kāi)始正題。
第一,談?wù)刦inal, finally, finalize的區(qū)別。
最常被問(wèn)到。
第二,Anonymous Inner Class (匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實(shí)現(xiàn))interface(接口)?
第三,Static Nested Class和Inner Class的不同,說(shuō)得越多越好(面試題有的很籠統(tǒng))。
第四,&和&&的區(qū)別。
這個(gè)問(wèn)得很少。
第五,HashMap和Hashtable的區(qū)別。
常問(wèn)。
第六,Collection和Collections的區(qū)別。
你千萬(wàn)別說(shuō)一個(gè)是單數(shù)一個(gè)是復(fù)數(shù)。
第七,什么時(shí)候用assert。
API級(jí)的技術(shù)人員有可能會(huì)問(wèn)這個(gè)。
第八,GC是什么?為什么要有GC?
基礎(chǔ)。
第九,String s = new String(xyz);創(chuàng)建了幾個(gè)String Object?
第十,(11.5)等於多少? (-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 1;有什么錯(cuò)? short s1 = 1; s1 = 1;有什么錯(cuò)?
面試題都是很變態(tài)的,要做好受虐的準(zhǔn)備。
第十二,sleep()和wait()有什么區(qū)別?
搞線程的最愛(ài)。
第十三,Java有沒(méi)有g(shù)oto?
第十三的問(wèn)題,如果哪個(gè)面試的問(wèn)到這個(gè)問(wèn)題,我勸你還是別進(jìn)這家公司。
第十四,數(shù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有l(wèi)ength()這個(gè)方法?
第十五,Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型?
常問(wèn)。
第十六,Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢?是用==還是equals()?它們有何區(qū)別?
第十七,給我一個(gè)你最常見(jiàn)到的runtime exception。
如果你這個(gè)答不出來(lái),面試的人會(huì)認(rèn)為你沒(méi)有實(shí)際編程經(jīng)驗(yàn)。
第十八,error和exception有什么區(qū)別?
第十九,List, Set, Map是否繼承自Collection接口?
第二十,abstract class和interface有什么區(qū)別?
常問(wèn)。
第二十一,abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized?
第二十二,接口是否可繼承接口?抽象類是否可實(shí)現(xiàn)(implements)接口?抽象類是否可繼承實(shí)體類(concrete class)?
第二十三,啟動(dòng)一個(gè)線程是用run()還是start()?
第二十四,構(gòu)造器Constructor是否可被override?
第二十五,是否可以繼承String類?
第二十六,當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?
第二十七,try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后?
第二十八,編程題:用最有效率的方法算出2乘以8等於幾?
有C背景的程序員特別喜歡問(wèn)這種問(wèn)題。
第二十九,兩個(gè)對(duì)象值相同((y) == true),但卻可有不同的hash code,這句話對(duì)不對(duì)?
第三十,當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,編程題:寫一個(gè)Singleton出來(lái)。
下面是答案
第一,談?wù)刦inal, finally, finalize的區(qū)別。
final—修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們?cè)谑褂弥胁槐桓淖儭1宦暶鳛閒inal的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載finally—再異常處理時(shí)提供finally塊來(lái)執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的catch子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入finally塊(如果有的話)。
finalize—方法名。Java技術(shù)允許使用finalize()方法在垃圾收集器將對(duì)象從內(nèi)存中清除出去之前做必要的清理工作。這個(gè)方法是由垃圾收集器在確定這個(gè)對(duì)象沒(méi)有被引用時(shí)對(duì)這個(gè)對(duì)象調(diào)用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize()方法是在垃圾收集器刪除對(duì)象之前對(duì)這個(gè)對(duì)象調(diào)用的。
第二,Anonymous Inner Class (匿名內(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)。
第三,Static Nested Class和Inner Class的不同,說(shuō)得越多越好(面試題有的很籠統(tǒng))。
Nested Class (一般是C的說(shuō)法),Inner Class (一般是JAVA的說(shuō)法)。Java內(nèi)部類與C嵌套類最大的不同就在于是否有指向外部的引用上
。具體可見(jiàn)// /> 注:靜態(tài)內(nèi)部類(Inner Class)意味著1創(chuàng)建一個(gè)static內(nèi)部類的對(duì)象,不需要一個(gè)外部類對(duì)象,2不能從一個(gè)static內(nèi)部類的一個(gè)對(duì)象訪問(wèn)一個(gè)外部類對(duì)象
第四,&和&&的區(qū)別。
&是位運(yùn)算符。&&是布爾邏輯運(yùn)算符。
第五,HashMap和Hashtable的區(qū)別。
都屬于Map接口的類,實(shí)現(xiàn)了將惟一鍵映射到特定的值上。
HashMap類沒(méi)有分類或者排序。它允許一個(gè)null鍵和多個(gè)null值。
Hashtable類似于HashMap,但是不允許null鍵和null值。它也比HashMap慢,因?yàn)樗峭降摹?/p>
第六,Collection和Collections的區(qū)別。
Collections是個(gè)下的類,它包含有各種有關(guān)集合操作的靜態(tài)方法。
Collection是個(gè)下的接口,它是各種集合結(jié)構(gòu)的父接口。
第七,什么時(shí)候用assert。
斷言是一個(gè)包含布爾表達(dá)式的語(yǔ)句,在執(zhí)行這個(gè)語(yǔ)句時(shí)假定該表達(dá)式為true。如果表達(dá)式計(jì)算為false,那么系統(tǒng)會(huì)報(bào)告一個(gè)
Assertionerror。它用于調(diào)試目的:
assert(a >0); // throws an Assertionerror if a <= 0
斷言可以有兩種形式:
assert Expression1;
assert Expression1: Expression2 ;
Expression1應(yīng)該總是產(chǎn)生一個(gè)布爾值。
Expression2可以是得出一個(gè)值的任意表達(dá)式。這個(gè)值用于生成顯示更多調(diào)試信息的String消息。
斷言在默認(rèn)情況下是禁用的。要在編譯時(shí)啟用斷言,需要使用source 1.4標(biāo)記:
javac -source 1.4要在運(yùn)行時(shí)啟用斷言,可使用-nableassertions或者-ea標(biāo)記。
要在運(yùn)行時(shí)選擇禁用斷言,可使用-da或者-disableassertions標(biāo)記。
要系統(tǒng)類中啟用斷言,可使用-esa或者-dsa標(biāo)記。還可以在包的基礎(chǔ)上啟用或者禁用斷言。
可以在預(yù)計(jì)正常情況下不會(huì)到達(dá)的任何位置上放置斷言。斷言可以用于驗(yàn)證傳遞給私有方法的參數(shù)。不過(guò),斷言不應(yīng)該用于驗(yàn)證傳遞給公有方法的參數(shù),因?yàn)椴还苁欠駟⒂昧藬嘌,公有方法都必須檢查其參數(shù)。不過(guò),既可以在公有方法中,也可以在非公有方法中利用斷言測(cè)試后置條件。另外,斷言不應(yīng)該以任何方式改變程序的狀態(tài)。