java String StringBuffer 和 StirngBuilder

1,先看String 定义的两种方式: String str = "abc"; String str = new String("abc"); 一旦定义 String 就不能改变,这个可以通过源码去看 java String StringBuffer 和 StirngBuilder

有这样的面试题:以下语句创建了几个对象?

                String str1 = new String("abc");

答案是:如果之前常量池里有“abc”了,就在堆中创建一个对象;如果常量池里没有“abc”对象,则先在常量池中把”abc”创建出来,然后再到堆空间中创建对象. 

    这个可以通过代码去验证:String str1 = new String("abc");  String str2 = "abc";   System.out.println(str1==str2); 去判断

2,StringBuffer 查看源码:类似于String的字符缓冲区,是一个容器 其内部维护了一个字符数组,用于存储字符java String StringBuffer 和 StirngBuilderjava String StringBuffer 和 StirngBuilder


我们查看源码发现 StringBuffer 类里面都是一些 同步方法(synchronized)是线程安全的。

3,StringBuilder 同样我们看源码,同样是定义 16 大小的长度。这里我就不贴图了。里没有同步方法,所以它是线程不安全的。

4,线程安全是在并发的时候回出现的问题,线程安全相对于线程不安全代码的效率就高。