2014-02-25 52 views
2

我有下面的代碼: -混亂的字符串不變性

public class StaticImplementer { 
    private static String str= "ABC"; 
    public static void main(String args[]) { 
     str = str + "XYZ"; 
    } 
} 

問題: -

  1. 這裏的字符串str是靜態的,又在哪裏這個對象將被存儲在內存中?

  2. 由於String是不可變的,其中「XYZ」的對象將被存儲在哪裏?

  3. 最終對象將被存儲在哪裏?

  4. 垃圾收集將如何完成?

+2

這些文字將被存儲在字符串池內存中。靜態對這個選擇無關緊要。因此,他們將被垃圾收集起來,以達到游泳池的目標。作爲文字/常量的總和,結果'str'也將存儲在池內存中,因爲在編譯時已知。更多信息在這裏:http://stackoverflow.com/questions/4918399/what-type-of-memory-heap-or-stack-string-constant-pool-in-java-gets-stored – Mik378

+0

Mik378: - 謝謝。這個,解釋很有幫助 – user2074417

+0

@ user2074417不客氣。 – Mik378

回答

2

這裏String str是靜態的,那麼這個對象將被存儲在哪個對象中? 內存?

字符串str不是一個對象,它是對象的引用。 "ABC","XYZ" & "ABCXYZ"是三個不同的String對象。因此,str指向一個字符串。你可以改變它指向的內容,但不能指向它指向的內容。

由於字符串是不可變的,「XYZ」的對象將被存儲在哪裏?

如上&解釋也由Mik378,"XYZ"只是其獲取保存在String池存儲器和當"XYZ"聲明或分配給任何其他對象返回給這個存儲器中的參考字符串對象。

最終對象將被存儲在哪裏?

最終對象"ABCXYZ"也將被保存到池內存中,並且當該操作被分配給任何變量時,引用將返回到該對象。

垃圾收集將如何完成?

字符串文字被實施。從Java 7開始,H​​otSpot JVM將字符串放入堆中,而不是permgen。在早期的Java版本中,JVM將實體字符串放置在permgen中。但是,在permgen的字符串被垃圾收集。顯然,permgen中的Class對象也是可收集的,所以permgen中的所有東西都是可收集的,儘管在某些舊的JVM中默認情況下可能不啓用permgen集合。

字符串文字,被攔截,將被聲明的Class對象聲明爲intern池中的String對象。因此,只有在引用它的Class對象也被收集的情況下,纔會收集字符串字符串。

Shishir

+0

>正如上面的解答和Mik378 =>同一個人;) – Mik378

+0

當您的答案更新時正處於打字過程中。 :) –

3

1)在此字符串str是靜態的,則其中該對象將被存儲在存儲器 ?

這些文字將被存儲在String 池內存,無論如果variable被聲明爲static與否。
這裏更多的信息:Where does Java's String constant pool live, the heap or the stack?

2)由於字符串是不可變的,其中 「XYZ」 的對象將被存儲在哪裏?

與第一個答案類似:文字將被存儲在池內存中。不變性只是允許共享池內存的概念。

3)最終對象將被存儲在哪裏?

根據Java specification,字面連接最終也會以文字結尾(因爲在編譯時已知),存儲在池存儲器中。
摘錄:

"This is a " +  // actually a string-valued constant expression, 
    "two-line string" // formed from two string literals 

4),以及如何將垃圾收集會做些什麼呢?

作爲池內存的本質,它們不會在默認情況下被垃圾收集。事實上,如果立即收集垃圾,池的「共享」概念將失敗。

+0

這裏,連接將在運行時完成,因爲OP的'str'不是最終的。 – Radiodef