繁体   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