三十二道java程序要經典面試題及答案



第一,談談final, finally, finalize的區別。

答:1、final修飾符(關鍵字),如果一個類被聲明爲final,意味着它不能再派生出新的子類,不能作爲父類被繼承。因此一個類不能既被聲明爲abstract,又被聲明爲final。將變量或方法聲明爲final,可以保證它們在使用不被改變。其初始化可以在兩個地方:一是其定義處,也就是說在final變量時直接給其賦值;二是在構造函數中。這兩個地方只能選其一,要麼在定義時直接給其賦值,要麼在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值,而在以後的引用中只能讀取,不可修改。被聲明爲final的方法也同樣只能使用,不能重寫(override)。

2、finally,在異常處理時提供finally塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的catch子句就會執行,然後控制就會進入finally塊(如果有的話)。

3、finalize,finalize是方法名。Java技術允許使用finalize()方法在垃圾收集器將對象從內存中清除出去之前做必要的處理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法是在垃圾收集器刪除對象之前對這個對象調用的。

第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?

答:匿名內部類必須繼承一個父類或者實現一個接口,所以匿名內部類可以繼承其他類,也可以實現其他接口。

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

答:1、nested class (一般是C++的說法),nested class是合成型聚集關係的另一種表達方式,也就是說nested class也可以用Aggregation表達出來。但是nested class更加精確地表達了一種專用的、緊耦合的關係,尤其是代碼生成時,nested class在Java中映射成inline class。比如,計算機專用開關電源類可以作爲計算機類的nested class,但是,電池組類就不一定適合作爲計算機的nested class,因爲,電池組類表述的是一個過於通用的對象,可能還被包含於模型中的其他設備對象。class A nested in class B,則說明A是一個nested class,一般A是用來完成B中的某種重要功能的。

2、inner class(一般是Java的說法),Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。靜態內部類(inner class)意味着:創建一個static內部類的對象,不需要一個外部類對象;不能從一個static內部類的一個對象訪問一個外部類對象。

第四,&和&&的區別。

答:&和&&都可以用作邏輯的運算符,表示邏輯關係與(end),但運算兩邊都是true的時候,結果爲true,如果運算結果的兩邊有一個結果是false,結果就爲false。&&具有短路功能,既但第一個表達式爲false的時候,就不會在計算第二個表達,返回的結果爲false。&還可以作爲位運算符,當&操作符兩邊不是boolean類型的時候,&表示按位與操作。

第五,HashMap和Hashtable的區別。

答:1、HashMap: Hash table based implementation of theMap interface. This implementation provides all of the optional map operations, and permitsnull values and thenull key. (The HashMap class is roughly equivalent toHashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

2、HashTable:This class implements a hashtable, which maps keys to values. Any non-null object can be used as a key or as a value. 

以上兩點來自API中HashMap和Hashtable的第一段對它們的描述。更加詳細的區別如下:

1、HashTable的方法是同步的,HashMap未經同步,所以在多線程場合要手動同步HashMap這個區別就像Vector和ArrayList一樣。(在HashMap的API中有說明)

2、HashTable不允許null值(key和value都不可以),HashMap允許null值(key和value都可以)。

3、HashTable有一個contains(Object value),功能和containsValue(Object value)功能一樣。

4、HashTable使用Enumeration,HashMap使用Iterator。

5、HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。

6、哈希值的使用不同,HashTable直接使用對象的hashCode。

第六,Collection 和 Collections的區別。

答:1、Collection:The root interface in thecollection hierarchy. A collection represents a group of objects, known as itselements. Some collections allow duplicate elements and others do not. Some are ordered and others unordered. The JDK does not provide anydirect implementations of this interface: it provides implementations of more specific subinterfaces likeSet andList. This interface is typically used to pass collections around and manipulate them where maximum generality is desired.

2、This class consists exclusively of static methods that operate on or return collections. It contains polymorphic algorithms that operate on collections, "wrappers", which return a new collection backed by a specified collection, and a few other odds and ends. 

1、java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式。

2、java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。

第七,什麼時候用assert.

答:assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制.在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;如果該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出.一般來說,assertion用於保證程序最基本、關鍵的正確性.assertion檢查通常在開發和測試時開啓.爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的.

第八,GC是什麼? 爲什麼要有GC?

答:gc:Runs the garbage collector.Calling thegc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

第九,String s = new String("xyz");創建了幾個String Object?

答:這個問題很複雜,參見:http://rednaxelafx.iteye.com/blog/774673#comments

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round(11.5) == 12;

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

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

答:short s1 = 1;s1 = s1 + 1 ;  在計算s1 = s1 + 1時,後面的s1被轉化爲int類型,造成類型不匹配。short s1 = 1; s1 += 1;沒有什麼錯。

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

答:sleep() :Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

wait():Causes the current thread to wait until another thread invokes thenotify() method or the notifyAll()method for this object. In other words, this method behaves exactly as if it simply performs the callwait(0).  The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notifymethod or thenotifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.  

第十三,Java有沒有goto?

答:Java用帶標籤的continue和break語句能夠完全代替goto的功能,所以Java中沒有goto。

第十四,數組有沒有length()這個方法? String有沒有length()這個方法?

答:數組中沒有length()方法,但是有length屬性。String類有length()方法,返回字符串的長度。

第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

答:方法的重寫(Overriding)和重載(Overloading)是Java多態性的不同表現。重寫(Overriding)是父類與子類之間多態性的一種表現,而重載(Overloading)是一個類中多態性的一種表現。
如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。
如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型或有不同的參數次序,則稱爲方法的重載(Overloading)。不能通過訪問權限、返回類型、拋出的異常進行重載.

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

答:通過hashCode和equals來保證Set中的元素不重複。Java中的八種原生數據類型的比較用==,但比較的是對象的時候,==是比較兩個對象的內存地址是否相同,equals()比較的是兩個對象的值是否相同。

第十七,給我一個你最常見到的runtime exception.

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

答:exception:1、可以是被控制的(checked)或不可以被控制的(unchecked);2、表示一個由程序員導致的錯誤;3、應該在應用程序級被處理。

error:1.總是不可控制的;2、經常用來表示系統錯誤或底層資源錯誤;3、如果可能的話應該在系統級被捕捉。

第十九,List, Set, Map是否繼承自Collection接口?

答:Set和List直接繼承自Collection接口,而Map不是繼承自Collection接口。

第二十,abstracclass和interface有什麼區別?

答:1、abstract class在java中表示的是一種繼承關係,一個類只能使用一次繼承關係,但是一個類可以現實多個interface;2、在abstract class中可以用自己的數據成員,也可以有非abstract的成員方法,而在interface中只能有靜態的、不可被修改的數據成員,所有的方法都是abstract的;3、abstract class和interface反映出的設計理念不同,abstract class表示的“is-a”的關係,而interface表示“like-a”的關係;4、實現抽象類和接口的類必須實現其中所有的方法,抽象類中可以有非抽象方法,但是接口中的方法不能有實現的方法;5、接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值;6、抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以重新賦值;7、接口中的方法默認都是 public,abstract 類型的。

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

第二十二,接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

答:接口可以繼承接口,抽象類可以實現接口

第二十三,啓動一個線程是用run()還是start()?

答:啓動一個線程用start()。

第二十四,構造器Constructor是否可被override?

答:構造方法只能被繼承,不能被重寫。

第二十五,是否可以繼承String類?

答:String類不可被繼承,因爲String類是一個final類。

第二十六,當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?

答:其它線程可以進入此對象的非同步的其它方法,不能進入其它的同步方法。

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

答:在程序拋出一個異常之後,進入相應的catch子句,

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

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

答:不對,當hashcode的值不同的,equals比較出來的值一定不同。

  第三十,當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞?

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

  第三十二,編程題: 寫一個Singleton出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章