6

当我们使用 String literal 创建字符串对象时,会调用字符串类的哪个构造函数。

例子:

String str = "hello";

在这种情况下,字符串类的哪个构造函数得到?

4

3 回答 3

11

当 JVM 加载一个包含字符串字面量的类时

String str = "hello";

它以 UTF-8 编码从类文件中读取字符串文字并从中创建一个 char 数组

char[] a = {'h', 'e', 'l', 'l', 'o'};

然后它使用 String(char[]) 构造函数从这个 char 数组创建一个 String 对象

new String(a)

然后 JVM 将 String 对象放入 String 池中,并将对该 String 对象的引用分配给str变量。

于 2013-07-15T10:29:37.190 回答
3

根据JVM 5.1 规范

为了派生字符串文字,Java 虚拟机检查 CONSTANT_String_info 结构给出的代码点序列。

  1. 如果先前已在包含与 CONSTANT_String_info 结构给出的相同的 Unicode 代码点序列的类 String 的实例上调用了方法 String.intern,则字符串字面量推导的结果是对同一类 String 实例的引用。

  2. 否则,将创建一个 String 类的新实例,其中包含由 CONSTANT_String_info 结构给出的 Unicode 代码点序列;对该类实例的引用是字符串文字派生的结果。最后,调用新 String 实例的 intern 方法。

因此,从这一点我们可以推断构造函数可以是:

String(int[] codePoints, int offset, int count)

分配一个新字符串,其中包含来自 Unicode 代码点数组参数的子数组的字符。offset 参数是子数组的第一个代码点的索引,count 参数指定子数组的长度。子数组的内容被转换为字符;后续修改 int 数组不会影响新创建的字符串。

甚至可以是私有构造函数

// Package private constructor which shares value array for speed.
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
于 2013-07-15T10:35:00.767 回答
1

Java 字符串包含不可变的 Unicode 字符序列。与 C/C++ 中字符串只是一个 char 数组不同,Java 字符串是 java.lang 类的对象。然而,Java String 是特殊的。与普通班级不同:

字符串以双引号文本的形式与字符串文字相关联,例如“Hello, world!”。您可以将字符串文字直接分配给 String 变量,而不是调用构造函数来创建 String 实例。

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

如何使用“”初始化字符串?

于 2013-07-15T10:17:23.660 回答