31、String s = new String("xyz");建立了幾個StringObject?是否可以繼承String類?
兩個或一個都有可能,”xyz”對應一個對象,這個對象放在字元串常量緩沖區,常量”xyz”不管出現多少遍,都是緩沖區中的那一個。NewString每寫一遍,就建立一個新的對象,它使用常量”xyz”對象的内容來建立出一個新String對象。如果以前就用過’xyz’,那麼這裡就不會建立”xyz”了,直接從緩沖區拿,這時建立了一個StringObject;但如果以前沒有用過"xyz",那麼此時就會建立一個對象并放入緩沖區,這種情況它建立兩個對象。至于String類是否繼承,答案是否定的,因為String預設final修飾,是不可繼承的。
32、String和StringBuffer的差別
JAVA平台提供了兩個類:String和StringBuffer,它們可以儲存和操作字元串,即包含多個字元的字元資料。這個String類提供了數值不可改變的字元串。而這個StringBuffer類提供的字元串可以進行修改。當你知道字元資料要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動态構造字元資料。
33、下面這條語句一共建立了多少個對象: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。
34、try {}裡有一個return語句,那麼緊跟在這個try後的finally{}裡的code會不會被執行,什麼時候被執行,在return前還是後?
我們知道finally{}中的語句是一定會執行的,那麼這個可能正常脫口而出就是return之前,return之後可能就出了這個方法了,鬼知道跑哪裡去了,但更準确的應該是在return中間執行,請看下面程式代碼的運作結果:
public classTest {
public static void main(String[]args) {
System.out.println(newTest().test());;
}
static int test()
{
intx = 1;
try
{
returnx;
}
finally
++x;
}
---------執行結果 ---------
1
運作結果是1,為什麼呢?主函數調用子函數并得到結果的過程,好比主函數準備一個空罐子,當子函數要傳回結果時,先把結果放在罐子裡,然後再将程式邏輯傳回到主函數。所謂傳回,就是子函數說,我不運作了,你主函數繼續運作吧,這沒什麼結果可言,結果是在說這話之前放進罐子裡的。
35、final, finally, finalize的差別。
final 用于聲明屬性,方法和類,分别表示屬性不可變,方法不可覆寫,類不可繼承。内部類要通路局部變量,局部變量必須定義成final類型。
finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆寫此方法提供垃圾收集時的其他資源回收,例如關閉檔案等。但是JVM不保證此方法總被調用
36、運作時異常與一般異常有何異同?
異常表示程式運作過程中可能出現的非正常狀态,運作時異常表示虛拟機的通常操作中可能遇到的異常,是一種常見運作錯誤。java編譯器要求方法必須聲明抛出可能發生的非運作時異常,但是并不要求必須聲明抛出未被捕獲的運作時異常。
37、error和exception有什麼差別?
error 表示恢複不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況。exception表示一種設計或實作問題。也就是說,它表示如果程式運作正常,從不會發生的情況。
38、簡單說說Java中的異常處理機制的簡單原理和應用。
異常是指java程式運作時(非編譯)所發生的非正常情況或錯誤,與現實生活中的事件很相似,現實生活中的事件可以包含事件發生的時間、地點、人物、情節等資訊,可以用一個對象來表示,Java使用面向對象的方式來處理異常,它把程式中發生的每個異常也都分别封裝到一個對象來表示的,該對象中包含有異常的資訊。
Java對異常進行了分類,不同類型的異常分别用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個子類:
Error和Exception,Error表示應用程式本身無法克服和恢複的一種嚴重問題,程式隻有奔潰了,例如,說記憶體溢出和線程死鎖等系統問題。
Exception表示程式還能夠克服和恢複的問題,其中又分為系統異常和普通異常:
系統異常是軟體本身缺陷所導緻的問題,也就是軟體開發人員考慮不周所導緻的問題,軟體使用者無法克服和恢複這種問題,但在這種問題下還可以讓軟體系統繼續運作或者讓軟體挂掉,例如,數組腳本越界(ArrayIndexOutOfBoundsException),空指針異常(NullPointerException)、類轉換異常(ClassCastException);
普通異常是運作環境的變化或異常所導緻的問題,是使用者能夠克服的問題,例如,網絡斷線,硬碟空間不夠,發生這樣的異常後,程式不應該死掉。
java為系統異常和普通異常提供了不同的解決方案,編譯器強制普通異常必須try..catch處理或用throws聲明繼續抛給上層調用方法處理,是以普通異常也稱為checked異常,而系統異常可以處理也可以不處理,是以,編譯器不強制用try..catch處理或用throws聲明,是以系統異常也稱為unchecked異常。
39、Java 中堆和棧有什麼差別?
JVM 中堆和棧屬于不同的記憶體區域,使用目的也不同。棧常用于儲存方法幀和局部變量,而對象總是在堆上配置設定。棧通常都比堆小,也不會在多個線程之間共享,而堆被整個 JVM 的所有線程共享。
棧:在函數中定義的一些基本類型的變量和對象的引用變量都是在函數的棧記憶體中配置設定,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量配置設定記憶體空間,當超過變量的作用域後,Java 會自動釋放掉為該變量配置設定的記憶體空間,該記憶體空間可以立即被另作它用。
堆:堆記憶體用來存放由 new 建立的對象和數組,在堆中配置設定的記憶體,由 Java 虛拟機的自動垃圾回收器來管理。在堆中産生了一個數組或者對象之後,還可以在棧中定義一個特殊的變量,讓棧中的這個變量的取值等于數組或對象在堆記憶體中的首位址,棧中的這個變量就成了數組或對象的引用變量,以後就可以在程式中使用棧中的引用變量來通路堆中的數組或者對象,引用變量就相當于是為數組或者對象起的一個名稱。
40、能将 int 強制轉換為 byte 類型的變量嗎?如果該值大于 byte 類型的範圍,将會出現什麼現象?
我們可以做強制轉換,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,是以,如果強制轉化,int 類型的高 24 位将會被丢棄,因為byte 類型的範圍是從 -128 到 128。這裡筆誤:-128到127
Java知音公衆号整理一些各大公司常用的面試筆試題,供大家在每天閑暇之餘學習其中幾道題目,日積月累,等到出去面試時,一切都水到渠成,面試時就自然會遊刃有餘了。
分享自Java知音
位址:https://mp.weixin.qq.com/s?__biz ... =21#wechat_redirect
更多學習資料可關注:annalin1203