使用String literal 创建String对象时调用哪个String类构造函数

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

例:

String str = "hello"; 

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

当JVM加载包含String文字的类时

 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变量。

根据JVM 5.1规范

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

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

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

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

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

分配一个新的String,其中包含Unicode代码点数组参数的子数组中的字符。 offset参数是子数组的第一个代码点的索引,count参数指定子数组的长度。 子arrays的内容转换为字符; 后续修改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; } 

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

String以双引号文本的forms与字符串文字相关联,例如“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 

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