JAVA基础题 常量池 String类底层

String s1="abc";
String s3=new string("abc");
s1和s3的区别:s1是不是直接引用了在常量池里“abc”所在的内存地址,而s3是先开辟了一块内存区域,然后把abc的值数据放在了这一块的内存位置上?

不知道是不是我这样理解,印象里教程视频里是这样讲的,晚点系统地看一遍书,看看书里是怎么说的

这里是关于JVM的相关知识

img

因为String在Java源码中是一个被final修饰的类:

img

所以每次操作都会生成新的String对象,然后将指针指向新的String对象。


//相当于在堆内存的常量池中 新开辟了 一块地址内存空间 内存空间存放的数据是“abc”
//而 s1是存在于栈内存中的 
// 此时栈内存中的s1 指向 了 堆内存空间中的常量池数据也就是 “abc”
String s1 = "abc";

//而当楼主 new String("abc")时 ,也是重新开辟了一块内存地址 将数据放到里面 s3 的指针 指向 新开辟的内存地址
String s3 = new String("abc");
System.out.println(s1 == s3); //false

https://blog.csdn.net/wangpingtaohn/article/details/70991150