StringBuffer和StringBuilder

StringBuffer和StringBuilder

StringBuffer

  • String类型的字符串,一旦new出来后不可变
/*这一行代码对创建了三个String对象:"abc","bc","abcbc"
  故如果频繁进行字符串拼接,会造成方法区里的字符串常量池里无用对象过多,造成浪费
  推荐使用StringBuffer或StringBulider
*/
String s1 = "abc"+"bc";
  • 在Java9之前 String,StringBuffer和StringBuilder的底层结构是char[]数组, 在这种方式下,每一个字符都将占用两个字节的空间。
  • 在Java9之后 String,StringBuffer和StringBuilder的底层结构是byte[]数组
  • coder的用法:
    1. 当检测到变量按照latin1或ISO进行标识时,会为其分配一个字节大小的空间;
    2. 当检测到变量按照utf-16进行标识时,会为其分配而两个字节大小的空间。

为什么同样底层是char[]数组,String不可变,StringBuffer可变

  • 因为String的底层数组char[]使用final修饰的,new出来后就只能指向这个数组的地址,而char[]数组一旦new出来后,长度不能变
  • StringBuffer的底层数组char[16],初始化长度16,没有用final修饰; 当长度不够时,会进行扩容,创建一个长度更大的的char[]数组,再使用System.arraycopy( )将内容复制到长度更长的数组中,这时StringBuffer转而指向这个数组的地址,而之前的对象会被gc回收.

怎么优化StringBuffer的性能

  • 在创建StringBuffer时,最好给一个初始化容量
  • 尽量减少StringBuffer的扩容次数
  • 关键点: 给一个合适的的初始化容量

StringBuffer和StringBuilder的区别

  • StringBuffer的方法都有用synchronized修饰,是线程安全的,速度较慢
  • StringBuilder的方法都没有用synchronized修饰,是线程不安全的,速度较慢
posted @ 2020-11-21 22:25  阿灿呀  阅读(139)  评论(0)    收藏  举报