a. JDK 1.8之前,需要三块内存完成操作,一是原来的"ab"字符串内存,一是新拼接来的"cd"字符串内存,一是拷贝两个字符串拼接在一起的新的String对象的字符串的内存;
b. JDK 1.8之后,编译器会将"+"字符串拼接操作根据需要编译成StringBuilder或者StringBuffer来处理。
String内部是一个final char[]存储的,被初始化后就不能改变这个数组,对String重新赋值实质上是在heap中重新创建String对象
StringBuilder的数据是存储在一个char[]中,再不断调用append或者delete方法来增加或删除字符串
StringBuilder的append方法最终调用的是父类AbstractStringBuilder的append方法 详细添加步骤见下面注释
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; ... public AbstractStringBuilder append(String str) { if (str == null) // append空字串处理 return appendNull(); // 计算要添加的字串长度 int len = str.length(); // 确保char数组的容量足够,对数组扩容, // 实质是调用Array.copyOf把原来的字串拷贝到新的长度的char[]中 ensureCapacityInternal(count + len); // 将需要append的字符串拷贝到新的value[]的末端 str.getChars(0, len, value, count); // 更新char[]长度 count += len; return this; } }StringBuffer与StringBuilder的区别是:
StringBuffer在创建时,自带了长度16,有初始字符串也会在字串长度基础上加16StringBuffer是线程安全的,方法都是同步方法,适用于多线程共享的变量,在性能上为了保证同步会有所牺牲。