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