一、字符串拼接的底层原理:
1.如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串;
String s1="abc";
String s2="a"+"b"+"c";
System.out.println(s1==s2);//true
s1是直接赋值的,受串池管理,s2在拼接时没有变量,就会触发字符串优化机制,在编译时生成class文件时,会将"a"+"b"+"c"拼接为"abc",所以在编译运行时也就是直接赋值的方式,就会复用串池中管理的地址,所以s1和s2记录的地址值一样,所以是true
2.如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存
String s1="abc";
String s2="ab";
String s3=s2+"c";
System.out.println(s1==s3);//false
==号比较引用数据类型比较的是地址值,因为s1是直接赋值,记录的是串池中的地址,s3有变量参与,所以会在堆中new一个新的对象,是不受串池管理的,所以记录的是堆中的地址,所以是false
二、StringBuilder原理分析:
StringBuilder默认容量是16,如果想添加超过16的就会扩容成(原来的容量*2+2),如果想添加超过扩容后的,比如要添加36个,就会以实际长度为准(容量:最多装多少;长度:已经装了多少)
package Test10;
public class StringDemo14 {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
System.out.println(sb.capacity());//16
System.out.println(sb.length());//0
sb.append("abcdefghijklmnopqrstuvwxyz0123456789");
System.out.println(sb.capacity());//36
System.out.println(sb.length());//36
}
}
运行结果: