StringBuffer和StringBuilder

时间:2020-11-21
本文章向大家介绍StringBuffer和StringBuilder,主要包括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[]数组,这时StringBuffer转而指向这个数组的地址,而之前的对象会被gc回收.

怎么优化StringBuffer的性能

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

StringBuffer和StringBuilder的区别

  • StringBuffer的方法都有用synchronized修饰,是线程安全的,速度较慢
  • StringBuilder的方法都没有用synchronized修饰,是线程不安全的,速度较慢