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

时间:2013-07-15 10:15:41

标签: java

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

示例:

String str = "hello";

在这种情况下,字符串类的构造函数是什么?

3 个答案:

答案 0 :(得分: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变量。

答案 1 :(得分:3)

根据JVM 5.1 spec

  

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

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

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

  4.   

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

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

  

分配一个新的String,其中包含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;
}

答案 2 :(得分:1)

  

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

     

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

How can a string be initialized using " "?