字符串原理

字符串存储的内存原理

  • 直接赋值会尝试服用字符串常量池中的数据

  • 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)

  • 如果扩容之后还不够,以实际长度为准