[英]Confusion on string immutability
我有以下代码:-
public class StaticImplementer {
private static String str= "ABC";
public static void main(String args[]) {
str = str + "XYZ";
}
}
问题: -
这里String str是静态的,那么该对象将存储在内存中的什么位置?
由于String是不可变的,因此“ XYZ”的对象将存储在哪里?
最终对象将存储在哪里?
以及如何进行垃圾收集?
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开始,HotSpot JVM将内部字符串放置在堆中,而不是permgen。 在Java的早期版本中,JVM将内部字符串放置在permgen中。 但是,permgen中的字符串是垃圾收集的。 显然,permgen中的Class对象也是可收集的,因此permgen中的所有内容都是可收集的,尽管在某些旧的JVM中可能默认情况下未启用permgen收集。
被嵌入的字符串文字将是由声明的Class对象持有的对内部池中String对象的引用。 因此,只有在还收集了引用了它的Class对象的情况下,才收集实习文本字符串。
Shishir
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.