- 字符串存储的内存原理
- 字符串拼接的底层原理
- StringBuilder提高效率原理图
- 字符串存储的内存原理
- 直接赋值
1)等号右边没有变量:
javac在编译class文件时,会直接拼接字符,此时等同于直接赋值一个字符串即
String s1="a"+"b"+"c"也就等同于String s1="abc";
2)等号右边有变量:
JDK8以前底层会使用Stringbuilder,详细过程为:
首先main方法先进栈,栈中声明变量S1,String s1= ,由于是直接赋值方式,先检查串池中是否有赋值的字符串,因为没有,将”a“添加至串池中,第二句String s2=s1+"b",同理将”b“添加至串池,因为有变量参与,在堆内存中创建StringBuilder对象,用append()方法将s1和”b“都添加至StringBuilder中。接着通过ToString方法将其转变为字符串。在这里要注意,ToString方法的底层也是通过new对象实现的。使用该方式进行一次字符串连接在栈内存会new两个对象,开辟两个地址空间。
JDK8字符串拼接底层原理,详细过程为:
jdk8对于含变量的字符串拼接采用的方法为先预估一个内存空间,创建一个数组,将变量的值放在数组中,然后在用Tostring方法将其转为字符串。