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.

从技术上讲,新字符串将获得 originalvaluehash

这意味着这是另一个字符串的副本。

是的,正如评论中已经提到的,这很简单。 由于您正在查看 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 依赖项。