字符串原理
字符串存储的内存原理
直接赋值会尝试服用字符串常量池中的数据
new出来的不会复用,而是开辟一个新的空间
==号比较的到底是什么
基本数据类型比较数据值
引用数据类型比较地址值
字符串拼接的底层原理
等号右边没有变量
public class Test {
public static void main(String[] args) {
String s = "a" + "b" + "c";
System.out.println(s);
}
}拼接项中不含变量,触发字符串的优化机制,在编译时得到最终结果,等同于直接赋值。
等号右边有变量
public class Test {
public static void main(String[] args) {
String s1 = "a";
String s2 = s1 + "b";
String s3 = s2 + "c";
System.out.println(s3);
}
}JDK8以前字符串拼接底层逻辑
在JDK8以前会使用StringBuilder进行拼接,内存图如下:

JDK8字符串拼接底层逻辑
预估字符串长度并创建长度与之对应数组
多变量参与时同样会创建多个对象浪费空间
结论
多字符串拼接,不要直接使用”+“。
在底层会创建多个对象,浪费性能。
推荐使用StringBuilder or StringJoiner
StringBuilder提高效率原理图
StringBuilder是一个内容可变的容器,其内存原理如下图所示:

StringBuilder运行机制
默认创建一个长度为16的字节数组
添加的内容长度小于16,直接存
添加的内容大于16会扩容(原来的容量*2+2)
如果扩容之后还不够,以实际长度为准
评论