2

我很想知道在以下情况下 String 对象行为的确切原因。

我很想了解以下代码段及其工作原理。

片段

String s1 = "I belong to String pool";
String s2 = new String("I'm present on Heap space"); 

问题:

  • 那些字符串文本,即存储在内存中的字符数组在哪里?“我属于字符串池”字符数组是否存在于字符串池中,而“我存在于堆空间”字符数组是否实际存在于堆空间中?

简而言之,谁能解释一下字符串字面量引用、字符串字面量文本、字符串对象引用s2、字符串对象文本等的存储位置。

像以下帖子这样的图表表示将非常有用。 http://theopentutorials.com/tutorials/Java/strings/string-literal-pool/

4

2 回答 2

2

在您的代码中,您有 3String秒:

  • 字面String意思是“我属于字符串池”。它将被实习在字符串池中。
  • 字面String意思是“我在堆空间上”。它将被实习在字符串池中。
  • 一个新String的结果new String("I'm present on Heap space")。它将创建一个新的String.

    这可以通过String(String)构造函数的实现来注意到:

    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    

    虽然新字符串的内容 (valuehash) 与原始字符串相同,但它将是一个新的引用。

于 2014-08-22T14:58:14.773 回答
2

(你可以检查这个答案,但我会尽量缩短一点。)

首先要意识到这是一个由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字符串)。

于 2014-08-22T17:48:08.397 回答