对字符串不变性的困惑
我有以下代码: –
public class StaticImplementer { private static String str= "ABC"; public static void main(String args[]) { str = str + "XYZ"; } }
问题: –
-
这里String str是静态的,那么这个对象将存储在内存中?
-
由于String是不可变的,“XYZ”的对象将被存储在哪里?
-
最终对象将在哪里存储?
-
垃圾收集将如何完成?
这里String str是静态的,那么这个对象将存储在内存中?
String str
不是对象,它是对象的引用。 "ABC"
, "XYZ"
和"ABCXYZ"
是三个不同的String对象。 因此, str
指向一个字符串。 您可以更改它指向的内容,但不能更改它指向的内容。
由于String是不可变的,“XYZ”的对象将被存储在哪里?
如上所述以及Mik378所述, "XYZ"
只是一个String对象,它被保存在String池内存中,当声明"XYZ"
或将其分配给任何其他对象时,将返回对该内存的引用。
最终对象将在哪里存储?
最终对象"ABCXYZ"
也将保存到池内存中,并且当操作分配给任何变量时,引用将返回到对象。
垃圾收集将如何完成?
字符串文字是实习的。 从Java 7开始,HotSpot 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)垃圾收集将如何进行?
作为池内存的本质,默认情况下它们不会被垃圾收集。 实际上,如果立即收集垃圾,池的“共享”概念将失败。