2014-05-20 101 views
0

我經歷的Java ranch site for Strings和下垃圾收集部分,說整個聲明是:內存對象

不像大多數的對象,字符串總是從字符串常量池給他們 參考。這意味着他們總是有一個 引用他們,因此,沒有資格收集垃圾 。

如果我有一個Java bean類,例如Web應用程序 - 如員工

public class Employee { 
    int employeId; 
    String firstName; 
    String lastName; 
    String fullName = firstName + lastName; // or firstName.concat(lastName); 
    .... Setters & Getters.... 
} 

如果應用程序創建這麼多的員工,所以這個bean被填充基於請求參數每次。此外,如果應用程序提供了搜索功能,用戶可以根據名字和姓氏查找員工,那麼我們需要填充此bean並將其傳遞到請求範圍中,以便用戶可以看到結果。

在這種情況下,應用程序正在爲firstName,lastName和fullName創建很多字符串。根據Java牧場網站給出的解釋,在一段時間之後我們是否會收到OutOfMemory錯誤?另外假設如果我只有firstName和lastNname又是字符串,即使我們沒有fullName,我們也面臨同樣的問題?

+0

當清理引用它們的類時,可以清理字符串文字。在許多應用程序中,這絕不會發生,但這並不意味着它們永遠不合格。 –

回答

6

字符串是不是與字符串文字相同。

在您的源代碼中,字符串文字類似於"paxdiablo"。從用戶獲取字符串不會創建字符串文字,它只是創建字符串數據本身,其中受垃圾回收。

基本上,這是什麼代碼段說明的是,在下面的代碼:

String xyzzy = "plugh"; 

"plugh"字符串常量永遠不會消失入位桶,但也有一些其他構建串(即非 - 文學)可能。

+0

感謝paxdiablo,這是否意味着當你說「創建字符串數據本身」時,會創建新的字符串對象而不是字符串字面值 – Chaitanya

+0

這意味着,如果你寫'String a =「xxx」;字符串b =「yyy」;字符串c = a + b; String d = new String(a);'只有兩個'String'在常量池中:「xxx」和「yyy」 –