(你可以检查这个答案,但我会尽量缩短一点。)
首先要意识到这是一个由arrayString
支持的对象char[]
,因此 String 本身可以位于内存中的不同位置,而不是包含实际字母的 char 数组。
从来源:
public final class String implements ... {
/** The value is used for character storage. */
private final char value[]; // <- String is backed by this array
...
}
所以对于你的问题:
那些字符串文本,即存储在内存中的字符数组在哪里?
对象和后备数组都String
存储在堆上,即使对于编译时字符串也是如此。字符串池仅包含对字符串的引用。
“我属于字符串池”字符数组是否存在于字符串池中,而“我存在于堆空间”字符数组是否实际存在于堆空间中?
不,一切都在堆上分配。字符串池仅包含引用。
简而言之,谁能解释一下字符串字面量引用、字符串字面量文本、字符串对象引用s2、字符串对象文本等的存储位置。
让我们从String
对象开始。将有 3 个字符串对象, original"I belong to String pool"
和"I'm present on Heap space"
new created "I'm present on Heap space"
。
但是,只有 2 个支持数组,因为前一点的第 2 个和第 3 个字符串将由相同的 char 数组支持。(您可以查看String(String)
构造函数)。
在字符串池中,将有 2 个引用:对原始的"I belong to String pool"
和"I'm present on Heap space"
在您的堆栈上,您还将有 2 个字符串引用,s1
与字符串池中的引用相同(= 它将指向相同的地址),但s2
会有所不同(因为您需要一个new
字符串)。