Java:StringBuffer和StringBuilder底层源码分析

315 阅读1分钟

1. String、StringBuffer、StringBuilder区别

  • String:不可变的字符序列;jdk1.0;char[]存储
  • StringBuffer:可变的字符序列;线程安全;效率比Builder低;jdk1.0;常用多线程;char[]存储
  • StringBuilder:可变的字符序列;线程不安全;效率高;jdk5.0;char[]存储

2. StringBuffer和StringBuilder为什么是可变?

  • 它们的底层char[]存储是一个长度16的数组

3. 如果StringBuffer和StringBuilder中添加一个长度小于16的字符串,底层char[]的长度会怎样

  • 底层char[]长度是:添加字符串的长度上+16

4. 对StringBuffer和StringBuilder使用length()输出的是什么?

  • 里面字符串多长就多长,不用加16

5. 如果StringBuffer和StringBuilder中添加超过16个字符怎么办?

  • 将原数组+添加字符的内容复制到一个新创造的一个长度为char[]长度×2+2的数组
  • 如果原数组+添加字符的长度要比char[]长度×2+2还要大,就直接创造一个等于原数组+添加字符的长度的数组并将内容复制
  • 默认情况下,扩容为原来容量2倍+2

提醒:

在开发中尽量使用public StringBuffer(int capacity) 构造器和public StringBulider(int capacity) 构造器,避免多次append会造成创建过多char[]数组