String class 中的空构造函数

Empty constructor in String class

所以当我偶然发现一个令人困惑的构造函数时,我正在阅读 String class。代码是这样的

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    /** The value is used for character storage. */
    private final char value[];

    /** Initializes a newly created {@code String} object so that it represents
    * an empty character sequence.  Note that use of this constructor is
    * unnecessary since Strings are immutable.
    */
    public String() {
        this.value = "".value;
    }
// the rest of the class code
}

我不明白

"".value;

做。这是什么""?是新的String object吗?如果是,用什么构造函数?

"" 是一个 String,因此有一个 char[] values,就像任何 String 一样。但是,它没有字符,使 values 成为一个空数组。

基本上,代码将 values 初始化为一个空数组。

What is this ""? Is it a new String object?

这是一个空字符串。它不一定是 new 并且很可能不是,因为字符串文字是 interned.

If it is, with what constructor?

在编译时,空字符串可能是由源代码创建的 Scanner from a sequence of input characters using String(char[], int, int)

在运行时,ClassLoader 可能通过 java_lang_String::create_from_unicode() 和朋友从 class 文件中以本机代码加载并驻留了字符串。

至于为什么使用"":是内存使用优化。由于字符串文字是 interned,因此 "".value 是对每个空字符串的相同底层字符数组的引用。

从存储库中,OpenJDK (7, 8) 以前使用 this.value = new char[0];。为源代码中出现的每个 new String() 创建一个新的 char 数组对象(即希望永远不会)。

当前 OpenJDK 9 有 "".value.

此更改可防止创建新的 char 数组,从而为每个非驻留但新创建的空字符串节省几个字节。更改后,所有零长度字符串共享相同的(零长度)字符数组。

我认为这是一种罕见的情况,因为我不记得我是否曾在任何地方使用过 new String()