对字符串不变性的困惑

我有以下代码: –

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. 垃圾收集将如何完成?

这里String str是静态的,那么这个对象将存储在内存中?

String str不是对象,它是对象的引用。 "ABC""XYZ""ABCXYZ"是三个不同的String对象。 因此, str指向一个字符串。 您可以更改它指向的内容,但不能更改它指向的内容。

由于String是不可变的,“XYZ”的对象将被存储在哪里?

如上所述以及Mik378所述, "XYZ"只是一个String对象,它被保存在String池内存中,当声明"XYZ"或将其分配给任何其他对象时,将返回对该内存的引用。

最终对象将在哪里存储?

最终对象"ABCXYZ"也将保存到池内存中,并且当操作分配给任何变量时,引用将返回到对象。

垃圾收集将如何完成?

字符串文字是实习的。 从Java 7开始,H​​otSpot JVM将实际的字符串放入堆中,而不是permgen。 在早期版本的Java中,JVM在permgen中放置了实际的字符串。 然而,permgen的字符串被垃圾收集。 显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,但在某些旧JVM中默认情况下可能不会启用permgen集合。

被实习的字符串文字将是由实体池中的String对象声明的Class对象所持有的引用。 因此,只有在收集了引用它的Class对象时才会收集实体文字字符串。

Shishir

1)这里String str是静态的,那么这个对象将存储在内存中?

无论variable是否声明为static ,这些文字都将存储在String 池内存中
更多信息: Java的String常量池在哪里,堆或堆栈?

2)因为String是不可变的,所以“XYZ”的对象将被存储?

与第一个答案类似:文字将存储在池内存中。 Immutability只允许共享池内存的概念。

3)最终对象将在哪里存储?

根据Java规范 ,文字的连接也将结束于文字(因为在编译时已知),存储在池内存中。
摘抄:

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

4)垃圾收集将如何进行?

作为池内存的本质,默认情况下它们不会被垃圾收集。 实际上,如果立即收集垃圾,池的“共享”概念将失败。