Java StringBuffer与StringBuilder

 

StringBuffer测试代码示例

public class TestStringBuffer {
    
    public static void main(String[] args) {
        String str1 = "I";
        String str2 = "love";
        String str3 = str1+str2+"China";
        /*
         * str3的创建采用了 变量连接常量的方式,最终会产生5个对象
         * 造成存在大量垃圾对象,浪费资源且效率低下
         */
        System.out.println(str3);
        //这种方式只会创建一个对象,因为使用常量连接,在编译器就可以被确定
        String str4 = "I"+"love"+"China";
        
        
        /*
         * 因为上述的创建字符串的方式存在缺陷,
         * 所以有了 StringBuffer类,解决了字符串拼接时
         * 产生大量垃圾对象的问题.
         * StringBuffer的内部实现采用的是字符数组,初始默认长度为16,
         * 字符串长度超过16时,扩充后长度=原数组长度*2+2
         * 
         * StringBuffer是线程安全的,性能会受到一定影响
         */
        StringBuffer sb = new StringBuffer();
        sb.append("I").append("love").append("China");
    }
}

 

StringBuilder:

  一个可变的字符序列,此类提供了与StringBuffer兼容的API(两个类的方法几乎一样,只是StringBuilder的方法少了synchronized关键字修饰),被设计成StringBuffer的简易替换。

当字符串缓冲区被单个线程使用的时候,建议优先使用该类。因为在大多数实现中,它比StringBuffer要快。

 

String s=null;
for(int i=0;i<5;i++) {
    s +=i;
       //每次循环都会创建一个StringBuilder实现字符串拼接,性能低。
       //最好手动创建StringBuilder来拼接,效率较高,且不换产生过多垃圾对象
}

 

StringBuffer与StringBuilder的区别:

  (1)StringBuffer是线程安全的,性能低,适合在多线程的情况下使用

  (2)StringBuildier不是线程安全的,性能高,适合在单线程的情况下使用,这种情况是占大多数的。

 

posted @ 2022-05-23 22:47  藤原豆腐渣渣  阅读(26)  评论(0编辑  收藏  举报