构造器
【1】空参构造器
String a=new String();
空构造器将字符串常量池中的空串"" 的地址赋给了value变量
//空参构造器底层是将空字符串""对应的字符数组赋值给正在创建的对象a
public String() {
this.value = "".value;
}
空字符串底层对应的数组什么都没有,只是创建了一个对象而已
【2】参数为String的构造器
String b=new String("abc");
//带String参数的构造器底层就是将字符串"abc"对应的字符数组赋值给正在构建的对象b
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
【3】参数为字符数组的构造器
//参数为字符数组的构造器底层是数组复制操作
为什么要复制一份,而不是直接用,因为String底层的char[] value是final修饰的,不可变
如果直接将字符数组的地址给value,那么如果对字符数组里的元素修改了,value指向的数组也会被修改
复制一份新的,就不用担心被修改
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
内存分析
【1】
public class TestString {
public static void main(String[] args){
String A="a"+"b"+"c";
String B="ab"+"c";
String C="abc"+"";
String D=A+"";
}
}
反编译后的.java文件
可以看出上面的常量字符串会进行编译期优化,直接合并成完整的字符串。
【2】
常量+常量 常量池
变量+常量 堆内存
对象.intern() 返回常量池对象