Day020 String、StringBuffer和StringBuilder
StringBuffer类
- java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。
- 很多方法与String相同。
- 作为参数传递时,方法内部可以改变值。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value; //value没有final声明,value可以不断扩容。
/**
* The count is the number of characters used.
*/
int count; //count记录有效字符的个数。
public class StringBufferBuilderTest {
public static void main(String[] args) {
StringBuffer sb1=new StringBuffer("abc");
sb1.setCharAt(0,'m');
System.out.println(sb1);
StringBuffer sb2=new StringBuffer();
System.out.println(sb2.length());
}
}
输出结果:
mbc
0
String、StringBuffer、StringBuilder三者的异同
- String:不可变的字符序列。底层用char[]存储。
- StringBuffer:可变的字符序列。线程安全的,效率偏低。底层用char[]存储。
- StringBuilder:可变的字符序列。线程不安全,效率高。底层用char[]存储。
扩容问题:如果要添加的数据底层数组盛不下,那就需要扩容底层的数组。默认情况下,扩容为
原来容量的2倍+2,同时将所有数组中的元素复制到新的数组中。
指导意义:开发中建议大家使用:StringBuffer(int capacity) 或StringBuider(int capacity)
StringBuffer类的常用方法
-
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接。
-
StringBuffer delete(int start,int end):删除指定位置的内容。
-
StirngBuffer replace(int start,int end,String str):把[start,end)位置替换为str。
-
StringBuffer insert(int offset,xxx):在指定位置插入xxx。
-
StringBuffer reverse():把当前字符序列逆转。
-
当append和insert时,如果原来value数组长度不够,可扩容。
-
如上这些方法支持方法操作。
-
方法链的原理:
@Override public StringBuilder append(String str) { super.append(str); return this; }