/**
     * Constructs a string buffer with no characters in it and an
     * initial capacity of 16 characters.
     */
    public StringBuffer() {
        super(16);
    }

String str1 = "He who has ";
		// 根据str1创建一个StringBuffer对象
		StringBuffer sbf = new StringBuffer(str1);
		System.out.println(sbf.capacity());//总空间
		System.out.println(sbf.length());//内容长度

为什么StringBuffer可以变长?

和String内部是一个字符数组一样,StringBuffer也维护了一个字符数组。 但是,这个字符数组,留有冗余长度
比如说new StringBuffer("the"),其内部的字符数组的长度,是19,而不是3,这样调用插入和追加,在现成的数组的基础上就可以完成了。
如果追加的长度超过了19,就会分配一个新的数组,长度比原来多一些,把原来的数据复制到新的数组中,看上去 数组长度就变长了 参考MyStringBuffer
length: “the”的长度 3
capacity: 分配的总空间 19

append追加 delete 删除 insert 插入 reverse 反转


String str1 = "He who has ";
		// 根据str1创建一个StringBuffer对象
		StringBuffer sbf = new StringBuffer(str1);
		// 在最后追加
		sbf.append("never been to the Great Wall is not a true man");
		System.out.println(sbf);
		// 删除0-6之间的字符
		sbf.delete(0, 6);
		System.out.println(sbf);
		// 在0这个位置插入 He who
		sbf.insert(0, "He who");
		System.out.println(sbf);
		// 反转
		sbf.reverse();
		System.out.println(sbf);

String和StringBuffer性能差别


public class Main {
	public static void main(String[] args) {
		int total = 10000;

		StringBuffer sb = new StringBuffer();
		String s = randomString(10);
		
		long start = System.currentTimeMillis();

		for (int i = 0; i < total * 100; i++) {
			sb.append("L");
		}
		long end = System.currentTimeMillis();
		System.out.printf("append 添加 %d 次 花费时间 %d \n ",total*100 , end - start);
		
		
		long start2 = System.currentTimeMillis();
		
		for (int i = 0; i < total; i++) {
			s += "L";
		}
		long end2 = System.currentTimeMillis();
		System.out.printf("+ 添加 %d 次 花费时间 %d \n",total , end2 - start2);
		
	}
	private static String randomString(int length) {
		String pool = "";
		for (short i = '0'; i <= '9'; i++) {
			pool += (char) i;
		}
		for (short i = 'a'; i <= 'z'; i++) {
			pool += (char) i;
		}
		for (short i = 'A'; i <= 'Z'; i++) {
			pool += (char) i;
		}
		char cs[] = new char[length];
		for (int i = 0; i < cs.length; i++) {
			int index = (int) (Math.random() * pool.length());
			cs[i] = pool.charAt(index);
		}
		String result = new String(cs);
		return result;
	}
	

}

StringBuffer和StringBuilder的区别

StringBuffer 是线程安全的
StringBuilder 是非线程安全的

所以当进行大量字符串拼接操作的时候,如果是单线程就用StringBuilder会更快些,如果是多线程,就需要用StringBuffer 保证数据的安全性

非线程安全的为什么会比线程安全的 快? 因为不需要同步嘛,省略了些时间


 @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }


  @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

文章参考:https://www.runoob.com/w3cnote/java-different-of-string-stringbuffer-stringbuilder.html