1,先看String 定义的两种方式: String str = "abc"; String str = new String("abc"); 一旦定义 String 就不能改变,这个可以通过源码去看
有这样的面试题:以下语句创建了几个对象?
String str1 = new String("abc");
答案是:如果之前常量池里有“abc”了,就在堆中创建一个对象;如果常量池里没有“abc”对象,则先在常量池中把”abc”创建出来,然后再到堆空间中创建对象.
这个可以通过代码去验证:String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1==str2); 去判断
2,StringBuffer 查看源码:类似于String的字符缓冲区,是一个容器 其内部维护了一个字符数组,用于存储字符
我们查看源码发现 StringBuffer 类里面都是一些 同步方法(synchronized)是线程安全的。
3,StringBuilder 同样我们看源码,同样是定义 16 大小的长度。这里我就不贴图了。里没有同步方法,所以它是线程不安全的。
4,线程安全是在并发的时候回出现的问题,线程安全相对于线程不安全代码的效率就高。