4

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

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吗?如果是,用什么构造函数?

4

2 回答 2

1

这是什么 ””?它是一个新的 String 对象吗?

这是一个空字符串。它不必是的,很可能不是,因为字符串文字是interned

如果是,用什么构造函数?

在编译时,空字符串可能是由源代码Scanner使用.String(char[], int, int)

在运行时,ClassLoader可能通过java_lang_String::create_from_unicode()和朋友在本机代码中从类文件中加载和实习字符串。

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

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

当前的 OpenJDK 9 具有"".value.

该更改阻止了创建新的 char 数组,因此为每个非实习但新创建的空字符串节省了几个字节。更改后,所有零长度字符串共享相同的(零长度)字符数组。

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

于 2016-05-14T11:51:50.180 回答
0

""是 a String,因此有char[] valuesa String。但是,它没有字符,形成values一个空数组。

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

于 2016-05-14T11:24:32.807 回答