Java面試常被問到的題目+解答

茶花盛開發表於2017-09-14

第一,anonymousinnerclass(匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?


不行,對於匿名內部類,看到的一句話說的很到位:


new <類或介面> <類的主體>

這種形式的new語句宣告一個新的匿名類,他對一個給定的類進行擴充套件,或實現一個給定的介面。他還建立那個類的一個新例項,並把他作為語句的結果而返回。


這就是匿名類的實質,它本身就是一個類的繼承或一個介面的實現,所以繼承其它類或藉口是無意義的.在eclipse中冶證實了我的想法.無論是繼承其它類還是實現其它藉口都顯示Syntax error on token。


第二,staticnestedclass和innerclass的不同,說得越多越好(面試題有的很籠統)。


static nested class 指靜態巢狀類,或稱巢狀類,是C++中常用的說法,inner class指內部類,是JAVA中的說法。


內部類是一個類內部類的統稱,具體分為四種:成員類,靜態成員類,區域性類,匿名類。其中匿名類是區域性類的特殊情況。對於成員類和靜態成員類都存在於類的頂層程式碼中。相當於類的靜態方法和非靜態方法的關係。區別在於成員類依賴於類例項而靜態成員類不依賴。所以前者只能訪問例項方法和成員而後者只能訪問靜態方法和成員。它們都用於建立一個只和當前類有關。和其它類無關的依賴類.是否靜態取決於是否依賴類的例項。區域性類相當於區域性變數。存在於類的區域性程式碼中。相當於在main()中隨意定義和使用類。唯一的不同是它只能使用final型的區域性變數。這和垃圾回收機制有關。即區域性變數會在程式碼塊結束後被回收。而物件不一定。所以物件只能使用final的區域性變數。同樣,區域性類存在的區域性程式碼塊也可以有靜態和非靜態的差別。區域性類罪常見的應用就是匿名類。匿名類就是無名子的區域性類。常在SWING設計中的新增監聽中出現。


static nested class相當於inner class中的靜態成員類。


第三,&和&&的區別。


這個問得很少。


&和^,<<,<<<,|同屬於位運算子,其中&是按位與,例如,1&1=1,1&0=0,&&是邏輯運算子,處理真假值,例如,true&&true=true。

如果你想學習Java可以來這個群,首先是二二零,中間是142,最後是906,裡面可以學習和交流,也有資料可以下載。


第四,hashmap和hashtable的區別。


常問。


hashmap可以看做是hashtable的替代者,HashMap的Value和Key都可為NULL,而HashTable不可以,同時,HashTable是執行緒同步的,而HashMap不是.HashTable用Iterator遍歷,HashMap用Enumeration遍歷。HashTable中hash陣列預設大小是11,增加的方式是 old*2+1。HashMap中hash陣列的預設大小是16,而且一定是2的指數。計算index的方法不同,HashTable直接利用hashcode()得出,HashMap對hashcode重新計算得出。


第五,collection和collections的區別。


你千萬別說一個是單數一個是複數。


collection是結合類的上級介面,子介面有List和Set等,Collections是java.util下的一個工具類,提供一些列靜態方法對集合搜尋排序執行緒同步化等。


第六,什麼時候用assert。


api級的技術人員有可能會問這個。


在除錯和優化中使用,用於判斷邏輯表示式真假,若為假,終止程式並返回異常.assert比if的優點在於可以選擇是否開啟assert檢查,也就是說assert產生的測試程式碼可以在正式釋出時候選擇忽略,這帶來極大便利,預設assert檢查是關閉的。此外,Junit相比assert來說,有著相似但更強大的測試能力。


第七,gc是什麼?為什麼要有gc?


基礎。


GC 即 garbage collection(垃圾收集),是JAVA用於回收記憶體的一種方式,主要的實現方法有引用計數,標記回收,複製清除等,GC可以避免記憶體洩露和堆疊溢位,有效提高記憶體的利用效率,同時將程式設計師從繁瑣的記憶體管理中釋放出來。


第八,string s=new string(“xyz”);建立了幾個stringobject?


2個,文字池中1個,堆中1個,先在文字池中建立1個”xyz”物件,再在堆中拷貝一個”xyz”物件,並將其賦給引用s。


第九,math.round(11.5)等於多少?math.round(-11.5)等於多少?


Math.round(x)相當於(int)Math.floor(x+o.5f),

故math.round(11.5)=Math.floor(11.5+0.5)=Math.floor(12)=12;

Math.round(-11.5)=Math.floor(-11)=-11;


第十,short s1=1;s1=s1+1;有什麼錯?short s1=1;s1+=1;有什麼錯?


面試題都是很變態的,要做好受虐的準備。


s1=s1+1會出錯,s1+1是int型,不能將int賦值給s1.需要顯示轉換,s1=(int)(s1+1).而s1+=1不會出錯,至於原因,有人說和編譯器的機制有關,需要看編譯原理,話說編譯原理什麼的最討厭了,就這樣吧。


第十一,sleep()和wait()有什麼區別?


搞執行緒的最愛。


1,sleep()是java.lang.Thread中的靜態方法,wait()是java.lang.Object中的方法;

2,sleep()用作當前執行緒阻塞自己,並在制定時間後恢復,wait()用於當前執行緒決定其他執行緒阻塞,是執行緒通訊的表現;

3,sleep()不釋放資源,wait()釋放資源;

4,sleep()必須捕獲異常,而wait()不需要。


第十二,java有沒有goto?


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


goto是java的關鍵字,但java不支援goto,goto會影響程式的可讀性,使邏輯顯得混亂。我的這本java教程上說因為同樣的原因,要儘量少用continue和break,且可以用等價的無continue/break迴圈代替,更不要說goto了…總之一句話,java不支援goto。


第十三,陣列有沒有length()這個方法?string有沒有length()這個方法?


陣列無,陣列是成員變數,length.String是成員函式length();我不知道這個題意義何在,平時都用eclipse的,會在意這個麼…


第十四,overload和override的區別。overloaded的方法是否可以改變返回值的型別?


常問。


我寫的一篇隨筆詳細說明了過載,重寫和多型之間的關係,返回值型別不包含在函式簽名中,所以只有返回值不同的過載不成立。


第十五,set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢?是用hashcode()還是equals()?它們有何區別?


這個屬於集合類的查詢機制問題,在集合類中,確定兩個元素是否相同,是用equals方法進行比較,hashcode的存在在於可以給元素快速分配一個index來儲存。可以將collection看做很多個大箱子,index是箱子的編號,先將要扔進去的物品進行hash確定index,扔進響應箱子,然後再喝箱子裡德其它物品equals()來比較是否相同。此外。相等的物品一定具有相同的hashcode,不等的物品不一定。具有相同hashcode的元素不一定相等。不同的hashcode的元素肯定不等。以上規則可以想象一下相等物品一定要分在同一個箱子中的情況。


第十六,給我一個你最常見到的runtimeexception。


如果你這個答不出來,面試的人會認為你沒有實際程式設計經驗。


NullPointerException,空引用異常.說實話,中軟的筆試題就有這個,我連題目意思都理解錯了,壓根沒認出來runtime exception是指執行時異常。


第十七,error和exception有什麼區別?


為什麼水的題最容易出現?


感覺這個題很水,要說C++的話有區別,感覺JAVA裡區別不大。反正中軟的題目裡我就瞎扯了。單純從字面的角度去說,error就是嚴重的錯誤,像JVM產生的一些錯誤等,會停止程式執行或產生錯誤結果。exception是一定程度上可預見的錯誤,可以捕獲以及處理。其實error也可以捕獲…


第十八,list,set,map是否繼承自collection介面?


Collection的子介面包括BeanContext, BeanContextServices, BlockingQueue<E>, List<E>, Queue<E>, Set<E>,SortedSet.不包括Map

差點被某網頁忽悠了,還是JAVA DOC比較專業。


第十九,abstractclass和interface有什麼區別?


常問。


真的是常問…


抽象類可以有抽象方法和普通方法,也可以有自己的資料成員。介面只允許有常量,抽象方法和靜態類成員。介面可以被多繼承,抽象類不行。介面被實現時,所有方法必須被重寫。抽象類被繼承時如果有抽象方法沒被重寫,則子類也為抽象類。


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


abstact方法需要子類重寫,重寫的概念是就例項方法而言, 所以不能是static。因為同一原因,要重寫就不能native,抽象方法在抽象類中,無例項,不能被呼叫,也沒有內容,所以synchronized沒有意義。abstract方法的修飾符只有private和public。


第二十一,介面是否可繼承介面?抽象類是否可實現(implements)介面?抽象類是否可繼承實體類(concreteclass)?


介面可以繼承介面,抽象類可以實現介面,抽象類可以繼承實體類。換句話說,抽象類除了不能例項化以外和普通類沒什麼區別。


第二十二,啟動一個執行緒是用run()還是start()?


用start(),start()會通過呼叫run()來實現多程式。


第二十三,構造器constructor是否可被override?


建構函式不能被重寫。


第二十四,是否可以繼承string類?


String類為final,不可被繼承。


第二十五,當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?


多執行緒程式設計涉及不多,運用到鎖的更是少的可憐

1 可以進入此物件其他非同步方法.

2 不可進入此物件此同步方法

3 不可進入此物件其他同步方法


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


return前被執行,有程式為證:



結果是:


retrun

finally

return 1


第二十七,程式設計題:用最有效率的方法算出2乘以8等於幾?


有c背景的程式設計師特別喜歡問這種問題。


第二十八,兩個物件值相同(x.equals(y)true),但卻可有不同的hashcode,這句話對不對?


這句話本身沒有錯,equals和hashcode都是Object的方法,都可以覆蓋並由程式設計師自己決定演算法,完全可以做到以上要求,但問題是如果是Collection中的元素,這樣做會帶來一些錯誤,一些不可預知的錯誤,所以在Collection中這樣做是禁止的。


第二十九,當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?


引用傳遞,毫無疑問,物件傳遞只能是引用.你可以換改變引用的內容,但並不能改變引用本身。


第三十,swtich是否能作用在byte上,是否能作用在long上,是否能作用在string上?


switch語句中的表示式只能是整數型別,即必須是int,char或者列舉型別資料。不能是boolean或浮點型,甚至其他型別的整數資料(byte,short及long)。


從教材上摘錄而來,應該相當權威了。


第三十一,程式設計題:寫一個singleton出來。


singleton模式即確保一個類只有一個例項,應用級singleton好像比較複雜,但最簡單的singleton還是很好實現的。


相關文章