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"; //所以指向的不是同一个对象
本文详细解析了Java中String对象在不同情况下的内存分配机制。包括常量池与堆内存的区别,以及final修饰符对字符串内存分配的影响。通过具体示例说明了字符串连接操作如何触发堆内存中新对象的创建。
614

被折叠的 条评论
为什么被折叠?



