String类

时间:2016-05-14 11:14:54

标签: java string constructor char string-pool

所以当我偶然发现一个令人困惑的构造函数时,我正在阅读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吗?如果是,用什么构造函数?

2 个答案:

答案 0 :(得分:1)

  

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

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

  

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

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

在运行时,ClassLoader已经通过java_lang_String::create_from_unicode()和朋友加载并从本机代码中的类文件中插入了String。

至于使用""的原因:它是一种内存使用优化。由于字符串文字是interned"".value是对每个空字符串的相同底层字符数组的引用。

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

目前的OpenJDK 9有"".value

此更改阻止创建新的char数组,从而为每个非实例但新创建的空字符串保存几个字节。更改后,所有零长度字符串共享相同(零长度)char数组。

我认为这是一个罕见的案例,因为我不记得我曾经在任何地方使用new String()

答案 1 :(得分:0)

""String,因此任何char[] values都会String。但是,它没有字符,使values为空数组。

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