簡體   English   中英

JAVA中字符串的不變性

[英]Immutability of String in JAVA

考慮代碼:

public class Stringer {

    public static void main(String[] args) {

        String s1 = "SomeLine";
        System.out.println(s1);  // prints SomeLine
        s1 = "AnotherLine";
        System.out.println(s1);  // prints AnotherLine
    }

}

當我將s1SomeLine更改為AnotherLine ,由於 Strings 是不可變的,這是否意味着SomeLine丟失並且符合 GC 的條件?

非常感激

當我將s1SomeLine更改為AnotherLine ,由於字符串是不可變的,這是否意味着SomeLine丟失並且符合 GC 的條件?

String是不可變的這一事實與您的問題無關。 您正在重新分配變量並因此丟失另一個引用這一事實決定了該對象是否是 GC 的候選對象。

要回答這個問題,如果它不是String文字就可以了。

此外,字符串字面量始終引用類 String 的同一個實例。 這是因為字符串文字 - 或者更一般地說,作為常量表達式(第 15.28 節)的值的字符串 - 使用方法String.intern被“嵌入”以便共享唯一實例。

String對象不會被垃圾回收,因為ClassLoader和相應的類都有對它的引用。

相關閱讀:

是的,你是對的,它確實有資格進行垃圾收集。 這是因為您不再使用變量引用原始字符串。

這是一個關於 SO 的相關問題:

Java 中的 String 對象不是不可變的嗎?

談論 Java 中的字符串並不是那么簡單。 即使字符串被實習,它仍然可以被垃圾收集。 在 Java 6 中,即使是在 permgen 中分配,也可以進行垃圾回收,而在 Java 7 中,它們是在 Heap 上分配的,並且仍然可以進行 GC。

通常實習字符串不符合垃圾收集條件,因為該類有對它的引用。 但是如果那個類是動態加載的(Class.forName)呢? 當該 Class 可以被卸載時很容易出現這種情況,因此GC 可以回收一個實習字符串

請參閱此處的示例,該示例表明可以對內部字符串進行垃圾回收。

暫無
暫無

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

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