区别:

StringBuffer类中的方法都有synchronized关键字修饰,表示StringBuffer在多线程环境下运行是安全的。

StringBuilder类中的方法无synchronized关键字修饰,表示StringBuffer在多线程环境下运行是不安全的。

用法:

由于Java中的string类的对象是不可变的(被final修饰),在做字符串的的拼接删除时会耗费极大空间,所以Java中又提供了StringBuffer和StringBuilder类,其对象是可以改变大小的,默认容量是16,超过会自动扩容。扩容会损耗性能,一般声明最好给出预先估计的大小。

/*
* Java中字符串是不可变的,每一次拼接会产生新字符串,这样会占用大量内存
*         String s="abc";
*         s+="hello";
*         以上两行代码会在方法区的字符串常量池中产生三个对象:"abc", "hello","abchello"
* */
public class StringBufferTest01 {
    public static void main(String[] args) {
        String s="";
        //字符串常量池会有很大的压力
        for (int i = 0; i <100 ; i++) {
            s+=i;  //每执行一次,都会在方法区的字符串常量池中产生新的对象,浪费空间
        }
    }
}
public class StringBufferTest02 {
    public static void main(String[] args) {
        //创建一个容量为16的byte[]数组(字符串缓冲区对象)
        StringBuffer stringBuffer=new StringBuffer();
        stringBuffer.append("a");
        stringBuffer.append("b");
        stringBuffer.append("cd");
        stringBuffer.append(100);
        stringBuffer.append(true);
        //append()方法在追加的时候,如果byte[]数组满了会自动扩容
        //在创建StringBuffer的时候尽可能给定一个初始化容量,尽可能的减少底层数组的扩容次数
        System.out.println(stringBuffer);

    }
}
public class StringBuilderTest01 {
    public static void main(String[] args) {
        StringBuffer sb =new StringBuffer();
        sb.append(100);
        sb.append(true);
        sb.append("hello");
        System.out.println(sb);

    }
}

更多推荐