所以当我偶然发现一个令人困惑的构造函数时,我正在阅读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
吗?如果是,用什么构造函数?
答案 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(7,8)之前使用过this.value = new char[0];
。为源代码中出现的每个new String()
创建了一个新的char数组对象(即希望永远不会)。
目前的OpenJDK 9有"".value
。
此更改阻止创建新的char数组,从而为每个非实例但新创建的空字符串保存几个字节。更改后,所有零长度字符串共享相同(零长度)char数组。
我认为这是一个罕见的案例,因为我不记得我曾经在任何地方使用new String()
。
答案 1 :(得分:0)
""
是String
,因此任何char[] values
都会String
。但是,它没有字符,使values
为空数组。
基本上,代码会将values
初始化为空数组。