簡體   English   中英

字符串不可變性的困惑

[英]Confusion on string immutability

我有以下代碼:-

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

問題: -

  1. 這里String str是靜態的,那么該對象將存儲在內存中的什么位置?

  2. 由於String是不可變的,因此“ XYZ”的對象將存儲在哪里?

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

  4. 以及如何進行垃圾收集?

1)在這里,字符串str是靜態的,那么該對象將存儲在內存中的什么位置?

無論variable是否聲明為static ,這些文字都將存儲在字符串池內存中
這里的更多信息: Java的String常量池位於哪里,堆或堆棧在哪里?

2)由於String是不可變的,“ XYZ”的對象將存儲在哪里?

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

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

根據Java規范 ,文字的連接也將最終存儲在池內存中的文字(由於在編譯時已知)。
摘抄:

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

4)如何進行垃圾收集?

作為池內存的本質,默認情況下不會進行垃圾回收。 實際上,如果立即收集垃圾,則池的“共享”概念將失敗。

這里String str是靜態的,那么該對象將存儲在內存中的什么位置?

字符串str不是對象,而是對對象的引用。 "ABC""XYZ""ABCXYZ"是三個不同的String對象。 因此, str指向字符串。 您可以更改其指向的內容,但不能更改其指向的內容。

由於String是不可變的,因此“ XYZ”的對象將存儲在哪里?

如上文以及Mik378所述, "XYZ"只是一個String對象,該對象保存在String池內存中,並且在聲明"XYZ"或將其分配給任何其他對象時,將返回對該內存的引用。

最終對象將存儲在哪里?

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

以及如何進行垃圾收集?

字符串文字是intern。 從Java 7開始,H​​otSpot JVM將內部字符串放置在堆中,而不是permgen。 在Java的早期版本中,JVM將內部字符串放置在permgen中。 但是,permgen中的字符串是垃圾收集的。 顯然,permgen中的Class對象也是可收集的,因此permgen中的所有內容都是可收集的,盡管在某些舊的JVM中可能默認情況下未啟用permgen收集。

被嵌入的字符串文字將是由聲明的Class對象持有的對內部池中String對象的引用。 因此,只有在還收集了引用了它的Class對象的情況下,才收集實習文本字符串。

Shishir

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM