当我们使用String literal创建字符串对象时,会调用字符串类的构造函数。
示例:
String str = "hello";
在这种情况下,字符串类的构造函数是什么?
答案 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)
为了派生字符串文字,Java虚拟机检查CONSTANT_String_info结构给出的代码点序列。
如果先前在类String的实例上调用了String.intern方法,该类包含与CONSTANT_String_info结构给出的Unicode代码点序列相同的Unicode代码点序列,则字符串文字派生的结果是对该字符串的引用类String的相同实例。
- 醇>
否则,将创建一个类String的新实例,其中包含CONSTANT_String_info结构给出的Unicode代码点序列;对该类实例的引用是字符串文字派生的结果。最后,调用新String实例的intern方法。
因此从这一点我们可以推断构造函数可以是:
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