Java 字符串构造函数是如何实现的?
How is Java String constructor implemented?
我正在查看 Java 字符串源代码,发现了一个我有疑问的 CTOR:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
我知道 Original 是作为文字 String
(带双引号)但无法理解 java/jvm 如何计算 original.value
作为 char
数组。这里的 "value" 是什么??如果值是 char
数组那么 .value
function/Field 是如何计算的???
docs 说
Initializes a newly created String object so that it represents the
same sequence of characters as the argument; in other words, the newly
created string is a copy of the argument string. Unless an explicit
copy of original is needed, use of this constructor is unnecessary
since Strings are immutable.
从技术上讲,新字符串将获得 original
的 value
和 hash
。
这意味着这是另一个字符串的副本。
是的,正如评论中已经提到的,这很简单。
由于您正在查看 String
class 本身 — 它可以访问自己的字段。这就是给定字符串所包含的字符实际存储的地方——在 char
数组中。此方法只是按名称引用字段,非常基本的交互。
字符串设计为包含 Unicode 文本,因此可以组合所有语言脚本。
为此,实现包含一个数组(字段名称 value
),其中每个字符都是一个两字节的 UTF-16 值。
您在 Java classes 中遇到了 AFAIK 唯一愚蠢的一点。
显示的复制构造函数毫无意义,因为字符串是不可变对象,
它们可以通过简单的分配来共享。它是 C++ 继承的化石,
可能与字符串实习有关。
复制毫无意义。这也适用于内部 char
数组,它确实可以通过引用分配。 (不是很重要。)
所以下面显示新手java的用法:
String s = new String(t);
在最新的 java 版本中,字符串的值实际上可能是某种编码中的字节数组,因此会延迟提供字符。
关于字符串文字:
字符串文字存储在名为 常量池 的 .class 文件中的数据结构中。存储为 UTF-8 字节。 JVM ClassLoader 确保将字符串加载为 String。
导入的final static String
个常量被复制到常量池中,原来的class可能不再显示为从中导入。
在另一个 class 中保持字符串常量可能需要手动进行干净的构建,因为可能不再存在 class 依赖项。
我正在查看 Java 字符串源代码,发现了一个我有疑问的 CTOR:
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
我知道 Original 是作为文字 String
(带双引号)但无法理解 java/jvm 如何计算 original.value
作为 char
数组。这里的 "value" 是什么??如果值是 char
数组那么 .value
function/Field 是如何计算的???
docs 说
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.
从技术上讲,新字符串将获得 original
的 value
和 hash
。
这意味着这是另一个字符串的副本。
是的,正如评论中已经提到的,这很简单。
由于您正在查看 String
class 本身 — 它可以访问自己的字段。这就是给定字符串所包含的字符实际存储的地方——在 char
数组中。此方法只是按名称引用字段,非常基本的交互。
字符串设计为包含 Unicode 文本,因此可以组合所有语言脚本。
为此,实现包含一个数组(字段名称 value
),其中每个字符都是一个两字节的 UTF-16 值。
您在 Java classes 中遇到了 AFAIK 唯一愚蠢的一点。
显示的复制构造函数毫无意义,因为字符串是不可变对象, 它们可以通过简单的分配来共享。它是 C++ 继承的化石, 可能与字符串实习有关。
复制毫无意义。这也适用于内部 char
数组,它确实可以通过引用分配。 (不是很重要。)
所以下面显示新手java的用法:
String s = new String(t);
在最新的 java 版本中,字符串的值实际上可能是某种编码中的字节数组,因此会延迟提供字符。
关于字符串文字:
字符串文字存储在名为 常量池 的 .class 文件中的数据结构中。存储为 UTF-8 字节。 JVM ClassLoader 确保将字符串加载为 String。
导入的final static String
个常量被复制到常量池中,原来的class可能不再显示为从中导入。
在另一个 class 中保持字符串常量可能需要手动进行干净的构建,因为可能不再存在 class 依赖项。