一、StringBuffer
StringBuffer是final修饰的类,但它存放的内容是可以改变的。
StringBuffer是线程安全的。
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
...
}
1、构造方法:
(1)默认的无参构造方法:public StringBuffer()
创建一个StringBuffer对象,默认大小为16。
StringBuffer sb = new StringBuffer();
//构造方法
public StringBuffer() {
super(16);
}
(2)以容量大小(整型)为参数的构造方法:public StringBuffer(int capacity)
创建指定大小的StringBuffer对象。
StringBuffer sb = new StringBuffer(100);
public StringBuffer(int capacity) {
super(capacity);
}
(3)以字符串为参数的构造方法:public StringBuffer(String str)
创建一个存在指定字符串的StringBuffer对象。
StringBuffer sb = new StringBuffer("Hello world!");
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
}
(4)以CharSequence为参数的构造函数:public StringBuffer(CharSequence seq)
创建一个存在指定字符序列的StringBuffer对象。
CharSequence c = "Hello world!";
StringBuffer sb = new StringBuffer(c);
此方法是调用了(2)的构造方法。
public StringBuffer(CharSequence seq) {
this(seq.length() + 16);
append(seq);
}
简单说一下,CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列。
//父类的构造方法
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
因为StringBuffer继承了AbstractStringBuffer,其构造方法均是直接或间接调用父类的构造方法。
2、成员方法
A、StringBuffer支持的方法
(1)将指定的字符串追加到此字符序列:public synchronized StringBuffer append(String str)
(2)将此字符序列用其反转形式取代:public StringBuffer reverse()
(3)移除此序列的子字符串中的字符:public delete(int start, int end)
(4)将 int 参数的字符串表示形式插入此序列中:public insert(int offset, int i)
(5)使用给定 String 中的字符替换此序列的子字符串中的字符replace(int start, int end, String str)
例子:
public class StringDemo {
public static void main(String[] args) {
String s1 = "world";
StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append(s1);
System.out.println(sb.toString());
System.out.println("-------------------");
sb.reverse();
System.out.println(sb.toString());
System.out.println("-------------------");
sb.insert(5," ");
System.out.println(sb.toString());
System.out.println("-------------------");
sb.delete(1, 3);
System.out.println(sb.toString());
System.out.println("-------------------");
sb.replace(1, 3, "666");
System.out.println(sb.toString());
System.out.println("-------------------");
}
}
B、与String类似的方法
(1)获取StringBuffer字符的长度:public synchronized int length()
(2)获取当前容量:public synchronized int capacity()
(3)确保容量至少等于指定的最小值:public synchronized void ensureCapacity(int minimumCapacity)
(4)调整当前容量大小:public synchronized void setLength(int newLength)
(5)获取此序列中指定位置处的 char 值:public synchronized char charAt(int index)
包括了String类的很多方法,在StringBuffer中也可以使用。此处不再举例表述。
因为StringBuffer中的方法几乎都是被synchronized修饰,所以StringBuffer可以保证线程安全。
二、StringBuilder
StringBuilder 类是在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。其他成员方法等等都是类似的。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
三、String、StringBuffer、StringBuilder的区别
String属于字符串常量,StringBuffer和StringBuilder属于字符串变量。
String在修改时,是重新创建了一个String对象,然后再把引用指向新的对象。
而StringBuffer和StringBuilder都是在原对象上进行字符串拼接操作。一般情况下推荐使用StringBuilder。
从执行速度方面来说,StringBuilder>StringBuffer>String
在大部分情况下 StringBuilder > StringBuffer> String,当涉及多线程的情况时,则选用StringBuffer。
StringBuilder速度快,但是线程不安全。
StringBuffer速度慢,但是线程安全。
回顾了一下StringBuffer和StringBuilder,大致对这两个类有了一定的了解。