Java面試題系列之基礎部分(四)——每天學5個問題
Java基礎部分學習的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,執行緒的語法,集合的語法,io的語法,虛擬機器方面的語法,這些都是最基本而且最易問到的,我們只要每天學一點點,日積月累知識面會更廣。
網路配圖
1、如何把一段逗號分割的字串轉換成一個數組?
如果不查jdk api,我很難寫出來!我可以說說我的思路:
(1)、用正則表示式,程式碼大概為:String [] result = orgStr.split(“,”);
(2)、用 StingTokenizer ,程式碼為:StringTokenizer tokener = StringTokenizer(orgStr,”,”);
String [] result =new String[tokener .countTokens()];
Int i=0;
while(tokener.hasNext(){result[i++]=toker.nextToken();}
2、陣列有沒有length()這個方法? String有沒有length()這個方法?
陣列沒有length()這個方法,有length的屬性;String有有length()這個方法。
3、下面這條語句一共建立了多少個物件: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。
4、final, finally, finalize的區別。
final 用於宣告屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
內部類要訪問區域性變數,區域性變數必須定義成final型別,finally是異常處理語句結構的一部分,表示總是執行。
finalize是Object類的一個方法,在垃圾收集器執行的時候會呼叫被回收物件的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉檔案等;JVM不保證此方法總被呼叫。
網路配圖
5、String和StringBuffer的區別
JAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字串,即包含多個字元的字元資料,這個String類提供了數值不可改變的字串,而這個StringBuffer類提供的字串進行修改。
當你知道字元資料要改變的時候你就可以使用StringBuffer,典型地做法,你可以使用StringBuffers來動態構造字元資料;另外,String實現了equals方法,new String(“abc”).equals(newString(“abc”)的結果為true,而StringBuffer沒有實現equals方法,所以,new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的結果為false。
接著要舉一個具體的例子來說明,我們要把1到100的所有數字拼起來,組成一個串;
StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++)
{
sbf.append(i);
}
上面的程式碼效率很高,因為只建立了一個StringBuffer物件,而下面的程式碼效率很低,因為建立了101個物件。
String str = new String();
for(int i=0;i<100;i++)
{
str = str + i;
}
在講兩者區別時,應把迴圈的次數搞成10000,然後用endTime-beginTime來比較兩者執行的時間差異,最後還要講講StringBuilder與StringBuffer的區別。
String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer物件儲存進Java集合類中時會出現問題。