String在内存中是如何储存数据的

142 阅读1分钟

首先明确String储存的是不可变的字符序列

下面是一个案例:

public void test`(){`
    String text1 = "锄禾日当午";
    String text2 = "汗滴禾下土";
    String text3 = "谁之盘中餐";
    text1 = text1 + text2 +text3;
    System.out.println(text1);
}

text1,text2,text3分别存储在不同的三个内存地址

image.png

接着分别进行拼接操作,分别指的是

        String temp = text1 + text2;
        text1 = temp + text3;

如下图:

image.png

text1中的内存改了,但是String在堆内存中里面的的数据的空间不能被GC回收,所以造成了内存的浪费。为什么会这样?

涉及到永久代(元空间)

String = "xxx";存储的数据是生成在永久代中,永久代里面的数据不会被gc回收。

关于新生代,老年代,永久代参考: jvm的新生代和老年代简介_iechenyb专栏-CSDN博客_jvm新生代

如何避免造成内存浪费的现象呢? 用StringBuffer或者Builder。

public static void main(String[] args) {
    StringBuffer sb = new StringBuffer();
    sb.append(1);
    sb.append(2);
    sb.append(3);
    String text = sb.toString();
    System.out.println(text);

}

虽然没有用 + 方法,但是不会更加节省空间。

再给出一个StringBuffer一个有趣的案例

public void testStringBuffer(){
    String str = null;
    StringBuffer sb = new StringBuffer();

    sb.append(str);

    System.out.println(sb.length());//4

    System.out.println(sb);//null ×  "null"√

    StringBuffer sb1 = new StringBuffer(str);

    System.out.println(sb1);///抛异常 NullPointerException
}