首先明确String储存的是不可变的字符序列
下面是一个案例:
public void test`(){`
String text1 = "锄禾日当午";
String text2 = "汗滴禾下土";
String text3 = "谁之盘中餐";
text1 = text1 + text2 +text3;
System.out.println(text1);
}
text1,text2,text3分别存储在不同的三个内存地址
接着分别进行拼接操作,分别指的是
String temp = text1 + text2;
text1 = temp + text3;
如下图:
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
}