String类在内存分析(编译期,运行期)
定义在堆的常量池中,栈中地址指向常量池中地址
String a = "小白猫";
如果常量池中有值,则在堆中new个地址指向常量池中值,栈中地址指向堆中new的地址,如果没有,则在堆的常量池中定义这个值,并且堆中new个地址指向常量池中值,栈中地址指向堆中new的地址
String b = new String("小白猫");
这个时候a和b不是指向同一个内存地址
定义在堆的常量池中,栈中地址指向常量池中地址
String c = "小白猫";
这个时候a和c是指向同一个内存地址
String a = "小白猫"; //这a是一个变量,只有在运行期才能确定,在编译期无法确定,所以在堆中创建了新的对象 String a1 = a+1; //在堆的常量池中创建了新的对象 String a2 = "小白猫1"; //所以指向的不是同一个对象
final String a = "小白猫"; //这a不是一个变量,在编译期可以确定,所以在堆的常量池中创建了新的对象 String a1 = a+1; //在堆的常量池中引用了对象 String a2 = "小白猫1"; //所以指向的是同一个对象
String getString(){ return "小白猫"; }
final String a = getString(); //这a加不加final都是一个变量,在编译期无法确定,所以在堆中创建了新的对象 String a1 = a+1; //在堆的常量池中引用了对象 String a2 = "小白猫1"; //所以指向的不是同一个对象