閱讀194 返回首頁    go 京東網上商城


收集Java麵試題知識點(Java基礎部分三)

1、String s = “Hello”;s = s + ” world!”;這兩行代碼執行後,原始的String對象中的內容到底變了沒有?

沒有。因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象。在這段代碼中,s原先指向一個String對象,內容是 “Hello”,然後我們對s進行了+操作,那麼s所指向的那個對象是否發生了改變呢?答案是沒有。這時,s不指向原來那個對象了,而指向了另一個 String對象,內容為”Hello world!”,原來那個對象還存在於內存之中,隻是s這個引用變量不再指向它了。
通過上麵的說明,我們很容易導出另一個結論,如果經常對字符串進行各種各樣的修改,或者說,不可預見的修改,那麼使用String來代表字符串的話會引起很大的內存開銷。因為 String對象建立之後不能再改變,所以對於每一個不同的字符串,都需要一個String對象來表示。這時,應該考慮使用StringBuffer類,它允許修改,而不是每個不同的字符串都要生成一個新的對象。並且,這兩種類的對象轉換十分容易。
實際上,當我們需要一個字符串對象時,應該使用如下語法來創建String對象:
Sring s = “fkjava.org”;
也就是直接使用字符串直接量的語法。而不是:
String s = new String(“fkjava.org”);
對於第二種語法而言,每次都會調用構造器生成新的String對象,性能低下且內存開銷大,並且沒有意義,因為String對象不可改變,所以對於內容相同的字符串,隻要一個String對象來表示就可以了。
基於這樣一種想法,Java提供了字符串緩存池來管理字符串直接量,當程序多次用到同一個字符串直接量時,係統會讓它們都引用字符串緩存池中的同一個String對象。因此使用在程序中使用字符串直接量可以充分利用這個特性來降低係統內存開銷,提高程序性能。

2、下麵這條語句一共創建了多少個對象:String s=”a”+”b”+”c”+”d”;

答案是
就創建了一個
String s = "a" + "b" + "c" + "d" + "e";
賦值符號右邊的"a"、"b"、"c"、"d"、"e"都是常量
對於常量,編譯時就直接存儲它們的字麵值而不是它們的引用
在編譯時就直接講它們連接的結果提取出來變成了"abcde"
該語句在class文件中就相當於String s = "abcde"
然後當JVM執行到這一句的時候, 就在String pool裏找
如果沒有這個字符串,就會產生一個

3、

4、

5、

6、

7、

8、

9、

10、

未完待續。。。

最後更新:2017-08-31 17:02:56

  上一篇:go  淺談物聯網用戶體驗目標的變化
  下一篇:go  中國好同事!幫程序猿跟姑娘表白,他們組了一支樂隊