[英]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
}
}
當我將s1
從SomeLine
更改為AnotherLine
,由於 Strings 是不可變的,這是否意味着SomeLine
丟失並且符合 GC 的條件?
非常感激
當我將
s1
從SomeLine
更改為AnotherLine
,由於字符串是不可變的,這是否意味着SomeLine
丟失並且符合 GC 的條件?
String
是不可變的這一事實與您的問題無關。 您正在重新分配變量並因此丟失另一個引用這一事實決定了該對象是否是 GC 的候選對象。
要回答這個問題,如果它不是String
文字就可以了。
此外,字符串字面量始終引用類 String 的同一個實例。 這是因為字符串文字 - 或者更一般地說,作為常量表達式(第 15.28 節)的值的字符串 - 使用方法
String.intern
被“嵌入”以便共享唯一實例。
該String
對象不會被垃圾回收,因為ClassLoader
和相應的類都有對它的引用。
相關閱讀:
談論 Java 中的字符串並不是那么簡單。 即使字符串被實習,它仍然可以被垃圾收集。 在 Java 6 中,即使是在 permgen 中分配,也可以進行垃圾回收,而在 Java 7 中,它們是在 Heap 上分配的,並且仍然可以進行 GC。
通常實習字符串不符合垃圾收集條件,因為該類有對它的引用。 但是如果那個類是動態加載的(Class.forName)呢? 當該 Class 可以被卸載時很容易出現這種情況,因此GC 可以回收一個實習字符串。
請參閱此處的示例,該示例表明可以對內部字符串進行垃圾回收。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.