1、String
String是不可变的,因为它在源码中是被final修饰的。
String a='a';
String b='b';
String c= a+b;
首先String a在jvm中会生成一个内存地址,String b 也会生成一个内存地址,String c 又会生成一个内存地址。
如果这样,我们得到“ab”这个字符串,因为String底层未不可变的字符串,所以会创建三个对象,都会占用内存,而这三个对象一直都未失去引用,所以jvm无法垃圾回收,造成内存资源的大量浪费,这在我们开发中是不推崇的,而StringBuilder 与StringBuffer则不存在这样的问题。
2、StringBuilder和StringBuff
StringBuilder 与StringBuffer都继承自AbstractStringBuilder,该类的char数组并没有用final修饰,内容是可变的。
StringBuilder的效率是比StringBuffer高的,StringBuilder未使用同步锁,所以效率提高
通过源码可以知道,StringBuffer在拼接字符串时,使用了同步锁(synchronized),所以安全性提高,
synchronized的锁是this锁,就是用当前类来当锁