非可變性(Immutability)和對象引用(Object reference)

一些比較核心的Java問題常常會用來考驗面試者的Java基本知識功底。這篇文章列出來了一些在個人書裏面沒有的面試題,經過這些面試題讀者也能夠梳理一下Java基礎知識點。html

Q1.下面的代碼片斷會輸出什麼?java

1
2
3
4
String s = " Hello " ;
s += " World " ;
s.trim( );
System.out.println(s);

A1.正確輸出是」 Hello  World 「。面試

因爲字符串先後都有空格,由於有些人可能會認爲結果是」Hello World」。那麼,這個題目想要考察的是什麼呢?安全

1.  字符串對象(String Object)是非可變的(immutable),這個題目容易迷惑人的地方在s.trim( )這一行。app

2.  理解對象引用和不可達對象會由垃圾回收器收集。ui

順着這個題目,你以爲還能夠考察哪些概念呢?spa

1.  例如,上面的代碼中一共會生成幾個字符串對象,何時這些對象會變成不可達對象從而被垃圾回收器回收。線程

2.  又好比,上面的代碼的效率如何?code

最好的解釋方式是經過一個圖表來講明,以下:htm

若是須要輸出先後沒有空格的」Hello World」,那麼應該將s.trim( )再賦值給」s」。這個賦值操做可讓s指向新建立出來的字符串對象。

上面的代碼也能夠改寫成以下方式:

1
2
3
StringBuilder sb = new StringBuilder( " Hello " );
sb.append( " World " );
System.out.println(sb.toString().trim( ));

StringBuilder不是一個線程安全的類,所以僅僅用做本地變量是沒有問題的。若是你但願用做實例變量,那麼能夠選擇線程安全的StringBuffer類。想知道字符串操做背後的原理嗎?能夠點擊這裏:String concatenation

相關文章
相關標籤/搜索