我有以下代码: -
public class StaticImplementer {
private static String str= "ABC";
public static void main(String args[]) {
str = str + "XYZ";
}
}
问题: -
这里String str是静态的,那么这个对象将存储在内存中?
由于String是不可变的,“XYZ”的对象将被存储在哪里?
最终对象将在哪里存储?
垃圾收集将如何进行?
答案 0 :(得分:3)
1)这里String str是静态的,然后存储该对象的位置 存储器?
无论variable
是否被声明为static
,这些文字都将存储在字符串池内存中。
更多信息:Where does Java's String constant pool live, the heap or the stack?
2)因为String是不可变的,所以“XYZ”的对象将被存储?
与第一个答案类似:文字将存储在池内存中。 Immutability只允许共享池内存的概念。
3)最终对象将在哪里存储?
根据Java specification,文字的连接也将结束于文字(因为在编译时已知),存储在池内存中。
摘录:
"This is a " + // actually a string-valued constant expression,
"two-line string" // formed from two string literals
4)垃圾收集将如何进行?
作为池内存的本质,默认情况下它们不会被垃圾回收。 实际上,如果立即收集垃圾,池的“共享”概念将会失败。
答案 1 :(得分:2)
这里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集合。
正在实习的字符串文字将是由声明的Class对象保留在实习池中的String对象所持有的引用。因此,只有在收集引用它的Class对象时,才会收集实习的文字字符串。
Shishir