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()
。
所以当我偶然发现一个令人困惑的构造函数时,我正在阅读 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()
。