由于String类的内容不能用于修改,Java提供一种字符串内容可变化的StringBuffer类。StringBuffer类的使用跟String类相似,但同时可以通过它的方法修改其自身长度和内容。StringBuffer类的设计是满足多线程的要求的,即StringBuffer类的对象可用于多个线程同时访问。
StringBuffer类有以下3个构造函数:
public StringBuffer();
默认的构造函数,初始是空字符串,默认长度为16。
public StringBuffer(int length);
规定长度的构造函数,初始是空字符串,长度为length。
public StringBuffer(String str);
将一个String类的对象str的内容复制到StringBuffer的内容中,StringBuffer的长度为str的长度加上16。
构造函数的程序片断如下:
……
StringBuffer sbuffer1 = new StringBuffer();
StringBuffer sbuffer2 = new StringBuffer(50);
String str = "This is a cat. That is a dog. I am a boy. What are you? ";
StringBuffer sbuffer3 = new StringBuffer(str);
……
和String类相似,StringBuffer类的length()方法返回StringBuffer中字符串的长度。StringBuffer类另外提供capacity()方法返回StringBuffer的容量。
ensureCapacity(int minimumCapacity)方法用来确保StringBuffer的容量不低于minimum Capacity。
setLength(int newLength)方法修改StringBuffer的字符串长度为newLength。
这几个方法的原型如下:
public int length( );
public int capacity( );
public void setLength(int newLength);
public void ensureCapacity(int minimumCapacity);
【例5-5】本例用来说明capacity(容量)与length(长度)的区别。
//~ StringBufferCapa.java
public class StringBufferCapa {
public StringBufferCapa() {
}
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
System.out.println("The length is: " + sBuffer.length());
System.out.println("The capacity is: " + sBuffer.capacity());
sBuffer.setLength(40);
System.out.println("Set the length is 40");
System.out.println("The length is: " + sBuffer.length());
System.out.println("The capacity is: " + sBuffer.capacity());
sBuffer.setLength(60);
System.out.println("Set the length is 60");
System.out.println("The length is: " + sBuffer.length());
System.out.println("The capacity is: " + sBuffer.capacity());
}
}
运行结果如下:
The length is: 26
The capacity is: 42
Set the length is 40
The length is: 40
The capacity is: 42
Set the length is 60
The length is: 60
The capacity is: 86
从结果可以看出length和capacity的区别:初始化的时候,由于length为26>16,于是capacity为26+16=42;设置length为40后,因为40<42,capacity不变;当设置的length为60,60>42,于是新的capacity就是60+16=86了。
charAt(int i)方法返回位置i上的字符,这个方法与String类的一样。
setCharAt(int i, char newChar)方法把第i个字符改成newChar的值。
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法将StringBuffer中的字符串从srcBegin到srcEnd之间的内容复制到目的字符数组dst[ ]的dstBegin的位置上。
reverse( )方法,顾名思义,就是将StringBuffer中的字符串反转。
【例5-6】说明setCharAt( )和reverse( )方法的程序示例。
//~StringBufferChar.java
public class StringBufferChar {
public StringBufferChar() {}
public static void main(String[] args) {
StringBuffer sBuffer =new StringBuffer("abcdefghijklmnopqrstuvwxyz");
for(int i = 5; i < 10; i++) {
sBuffer.setCharAt(i, '-'); //将从5到9的位置设为'-'
}
System.out.println(String.valueOf(sBuffer)); //打印sBuffer的内容
sBuffer.reverse(); //反转内容
System.out.println(String.valueOf(sBuffer)); //打印sBuffer的内容
}
}
运行结果如下:
abcde-----klmnopqrstuvwxyz
zyxwvutsrqponmlk-----edcba
在String类中,要连接两个字符串需要创建一个新的String来保存;而在StringBuffer类中提供了append( )方法,直接在字符串后添加更多的内容。
append( )方法有以下10种重载的形式。
· append(boolean b):在字符串后附加一个布尔型参数的字符串。
· append(char c):在字符串后附加一个字符型参数的字符串。
· append(int i):在字符串后附加一个整型参数的字符串。
· append(long l):在字符串后附加一个长整型参数的字符串。
· append(float f):在字符串后附加一个浮点数型参数的字符串。
· append(double d):在字符串后附加一个双精度型参数的字符串。
· append(char[] str):在字符串后附加一个字符数组参数组成的字符串。
· append(char[] str, int offset, int len):在字符串后附加字符数组中由offset开始且长度为len的部分的字符串。
· append(Object o):在字符串后附加一个Object参数的字符串。
· append(String str):在字符串后附加String类的字符串。
【例5-7】程序示例。
//~StringBufferAppend.java
public class StringBufferAppend{
public StringBufferAppend() {}
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer("abcd");
sBuffer.append("----");
sBuffer.append(" boolean:");
sBuffer.append(true);
sBuffer.append(" int:");
sBuffer.append(1);
sBuffer.append(" double:");
sBuffer.append(3.1415926);
System.out.println(String.valueOf(sBuffer));
}
}
运行结果如下:
abcd---- boolean:true int:1 double:3.1415926
StringBuffer类中使用insert( )方法往字符串中插入一个字符串,与append( )方法相似,根据插入的参数的不同,insert( )方法也有以下10种重载形式:
· StringBuffer insert(int offset, boolean b)。
· StringBuffer insert(int offset, char c)。
· StringBuffer insert(int offset, char[] str)。
· StringBuffer insert(int index, char[] str, int offset, int len)。
· StringBuffer insert(int offset, double d)。
· StringBuffer insert(int offset, float f)。
· StringBuffer insert(int offset, int i)。
· StringBuffer insert(int offset, long l)。
· StringBuffer insert(int offset, Object obj)。
· StringBuffer insert(int offset, String str)。
参数offset指示插入字符串的位置,其他参数的含义和append( )方法一样。
要在StringBuffer类中删除一段字符串,可以使用delete( )和deleteCharAt( )方法。
StringBuffer delete(int start, int end);
从StringBuffer的字符串中删除从start到end的子串。
StringBuffer deleteCharAt(int index)
从参数index指定的位置上删除一个字符,StringBuffer的长度缩短一个字符。
【例5-8】程序示例。
//~StringBufferInsDel.java
public class StringBufferInsDel {
public StringBufferInsDel() {}
public static void main(String[] args) {
StringBuffer sBuffer = new StringBuffer();
sBuffer.insert(0, true);
sBuffer.insert(2, 3.1415926);
sBuffer.insert(4, "boolean");
System.out.println(String.valueOf(sBuffer));
System.out.println("The length is: " + sBuffer.length());
sBuffer.delete(4, 11);
System.out.println(String.valueOf(sBuffer));
System.out.println("The length is: " + sBuffer.length());
}
}
运行结果如下:
tr3.boolean1415926ue
The length is: 20
tr3.1415926ue
The length is: 13
StringBuffer类和String类的转化:
StringBuffer类提供了toString( )方法,返回与StringBuffer字符串内容一样的一个String类的对象。
StringBuffer toString();
由5.1节字符串String类的介绍可知,这个方法其实跟String类的静态方法valueOf确良(StringBuffer sb)的效果是一样的。
与String类一样,String Buffer类也提供定位字符和字符串的方法,如下所示:
int indexOf(StringBuffer str);
int indexOf(StringBuffer str, int fromIndex);
int lastIndexOf(StringBuffer str);
int lastIndexOf(StringBuffer str, int fromIndex);
由于例子与String类的相似,这里不一一枚举。