Java筆試面試題(四)

每日一句:我既不悲觀,也不樂觀,只是每天早上睜開眼睛迎接新的一天,一個人努力過下去

1. 下面這條語句一共創建了多少個對象:String s = "a"+"b"+"c"+"d";

對於如下代碼:

String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");

第一條語句打印的結果爲false,第二條語句打印的結果爲true,這說明javac編譯可以對字符串常量直接相加的表達式進行優化,不必要等到運行期去進行加法運算處理,而是在編譯時去掉其中的加號,直接將其編譯成一個這些常量相連接的結果。
題目中第一行代碼被編譯器在編譯時優化後,相當於直接定義了一個"abcd"的字符串,所以,上面的代碼應該只創建了一個String對象。寫如下兩行代碼:

String s = "a"+"b"+"c"+"d";
System.out.println(s == "abcd");

最終打印結果爲true.

2. final, finally, finalize 的區別。
final 用於聲明屬性、方法和類,分別表示屬性不可變、方法不可覆蓋、類不可繼承。內部類要訪問局部變量,局部變量必須定義爲final類型。
finally 是異常處理語句結構的一部分,表示總是執行。
finalize 是Object類的一個方法,在垃圾收集器執行的時候會調用被收回對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。JVM不保證此方法總被調用。
3. 運行時異常與一般異常有什麼異同?
異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
4. error和exception有什麼區別
error表示恢復不是不可能但是很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。exception表示一種設計或實現問題。也就是說,它表示如果程序能運行正常,從不會發生的情況。
5. Java語言如何進行異常處理,關鍵字 throws,throw,try,catch,finally 分別代表什麼意義?在try塊中可以拋出異常嗎?
java的異常處理是通過以上5個關鍵字來實現的,一般情況下使用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這個時候你可以通過它的類型來捕獲(catch)它,或者最後(finally)由缺省處理器來處理。用try來指定一塊預防所有“異常”的程序,緊跟在try後面應該包含一個catch子句,來指定你要捕獲的異常類型。
throw語句用來明確的拋出一個異常。
throws用來標明一個成員函數可能拋出的的各種異常。
finally爲確保一段代碼不管發生什麼異常都被執行的一段代碼。
6. java中有幾種方法實現線程?
兩種:分別是繼承Thread類與實現Runnable接口。
用synchronize關鍵字修飾同步方法。
反對使用stop(),因爲它不安全。suspend() 方法用以發生死鎖。
7. sleep() 和 wait() 有什麼區別?
網絡答案:sleep()是線程類(Thread)的方法,導致此線程暫停執行指定時間,把執行機會給其他線程,但是監控狀態依然保持,到時候會自動恢復。調用sleep()不會釋放對象鎖。wait()是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
8. 同步和異步有什麼異同,在什麼情況下分別使用它們?
如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。
當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待的方法返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
9. 多線程有幾種實現方法?同步有幾種實現方法?
多線程分別是繼承Thread類和實現Runnable接口兩種方法實現。
同步的實現也有兩種方法:分別是synchronize,wait和notify。
wait() :使一個線程處於等待狀態,並且釋放所持有對象的lock。
sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕獲InterrupedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由jvm確定喚醒哪個線程,而且不是按優先級。
notifyAll():喚醒所有處於等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
10. 啓動一個線程使用run() 還是 start() ?
啓動一個線程是調用start()方法,使線程就緒狀態,以後就可以被調度爲運行狀態了,一個線程必須關聯一些具體的執行代碼,run()方法是該線程所關聯的執行代碼。
11. 當一個線程進入一個對象的一個synchronized方法後,其它線程是否可以進入此對象的其他方法?
(1)其他方法前是否加了synchronized關鍵字,如果沒加,則能。
(2)如果這個方法內部調用了wait(),則可以進入其他synchronized方法。
(3)如果其他方法都加了synchronized關鍵字,並且內部沒有調用wait(),則不能。
(4)如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因爲非靜態的方法用的是this。
12. List和Map的區別?
List存儲的是單列數據的集合,Map是存儲鍵和值這樣的雙列的數據集合,List中存儲的數據是有順序的並且允許重複;Map中存儲的數據是沒有順序的,其鍵不可重複,但值可以重複。
13. List,Set,Map是否繼承自Collection接口?
List,Set是,Map不是。
14. HashMap和HashTable的區別?
HashMap是HashTable的輕量級實現(非線程安全的實現),HashTable是基於陳舊的Dictionary類的,HashMap是Java1.2引進的Map接口的實現;
HashMap允許空(null)鍵值(key),由於線程安全,在只有一個線程訪問的情況下,效率高於HashTable;
HashMap允許將null作爲一個entry的key或者value,而HashTable不允許;
HashMap是HashTable的contains方法去掉了,換成containsValue和containsKey。
HashTable的方法是synchronize的,而HashMap不是,在多個線程訪問HashTable時,不需要自己爲它的方法實現同步,而HashMap就必須爲之提供外同步。
15. Collection和Collections的區別?
Collection是集合類的上級接口,繼承於它的接口主要有Set和List;
Collections是針對集合類的一個幫助類,它提供一系列靜態方法對各種集合的搜索、排序、線程安全化等操作。
16. 兩個對象值相同(a.equals(b) == true),但卻有不同的hash code,這句話對不?
對。
17. 簡單描述一下JVM加載class文件的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
18. heap和stack有什麼區別?
java的內存分爲兩類,一種是棧內存,一種是堆內存。棧內存是指程序進入一個方法時,會爲這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是棧作用的不同內存,一般用於存放不在當前方法棧中的那些數據,例如:使用new創建一個對象都放在堆裏,所以,他不會隨着方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中而不是棧中。
19. GC是什麼? 爲什麼要有GC?
GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者是錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC機制可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯式操作方法。
20. 寫出單例模式(Singleton)

//第一種 :餓漢模式

public class SingleTon{
    private SingleTon(){}
    //實例化放在靜態代碼塊裏可提高程序的執行效率,但也可能佔用更大的空間
    private final static SingleTon instance = new SingleTon();
    public static SingleTon getInstance(){
        return instance;
    }
}

//第二種:懶漢模式

publi class SingleTon{
    private SingleTon(){}
    private static instance = null;
    public static synchronized SingleTon getInstance(){
        if(instance == null){
            instance = new SingleTon();
        }
        return instance;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章