三者内部都是维护一个字节数组, String abc=new String(); String采用的16进制编码, 里面的字节数组是final 修饰的,不允许在原来的基础上修改,所以会生成一个新的字节数组 private final byte[] value; 底层调用 System.arraycopy(value, 0, dst, dstBegin << coder, value.length); 这个是浅复制,原来的的字节数组会被垃圾回收器回收StringBuilder 与StringBuffer 在构造时会判断是不是开启了字符压缩【默认就是字符压缩】,是的话采用LATIN1进制编码,不然就16进制编码 StringBuilder 与StringBuffer默认字符容量是16,实现了AbstractStringBuilder这个类,他们的字符拼接底层会调用newCapacity 器扩容时2倍加2【 int newCapacity = (oldCapacity << 1) + 2;[容量左移一位加2]】byte[] value字节数组没有final限定符修饰,所以可以继续扩容量 底层用的是 str.getBytes(value, index, coder); 他会把新的字符运原来的字符拼接,长度重新计算,在原来的字节数组基础上进行扩容 StringBuilder stringBuilder=new StringBuilder(); stringBuilder.append() StringBuffer stringBuffer=new StringBuffer(); stringBuffer.append()