String
不可变的类。类被final修饰
存储数据的数组不可变,因为也被final 修饰
不会初始化容量大小和扩容。value只能被初始化一次。value变量其实就是存储了String字符串中的所有字符。
无论是String的 concat() 方法还是substring() 方法,都是创建了新的String对象。
所以,String对象频繁的进行拼接,截取,替换操作效率很低下
StringBuilder
继承抽象类:AbstractStringBuilder
初始化容量:16
StringBuilder stringBuilder = new StringBuilder();
可以扩容。
stringBuilder.append("fdsfvds");
append过程及扩容机制
StringBuffer
流程和StringBuilder一样,说说不一样的地方:
方法使用了 synchronized 关键字修饰,在多线程下的操作字符串的安全性。
比StringBuilder 多了 toStringCache参数,每次 append 都会将 toStringCache 置位 null
因为在 toString 的时候会判断toStringCache是否为null,在多次调用其toString方法时,其new出来的String对象是会共享同一个char[] 内存的,达到共享的目的。所以主要到StringBuffer做了修改都会将toStringCache设置为null。