您的位置: 网站首页 > 程序开发 > Java程序设计 > 第5章 字符串操作 > 【5.2 StringBuffer类】

5.2 StringBuffer类

 

5.2  StringBuffer

由于String类的内容不能用于修改,Java提供一种字符串内容可变化的StringBuffer类。StringBuffer类的使用跟String类相似,但同时可以通过它的方法修改其自身长度和内容。StringBuffer类的设计是满足多线程的要求的,即StringBuffer类的对象可用于多个线程同时访问。

5.2.1  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);

……

5.2.2  length( )capacity( )setLength( )ensureCapacity( )方法

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

从结果可以看出lengthcapacity的区别:初始化的时候,由于length26>16,于是capacity26+16=42;设置length40后,因为40<42capacity不变;当设置的length6060>42,于是新的capacity就是60+16=86了。

5.2.3  charAt( )setCharAt( )getChars( )reverse( )方法

charAt(int i)方法返回位置i上的字符,这个方法与String类的一样。

setCharAt(int i, char newChar)方法把第i个字符改成newChar的值。

getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 方法将StringBuffer中的字符串从srcBeginsrcEnd之间的内容复制到目的字符数组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, '-');  //将从59的位置设为'-'

        }

        System.out.println(String.valueOf(sBuffer));    //打印sBuffer的内容

        sBuffer.reverse();              //反转内容

        System.out.println(String.valueOf(sBuffer));    //打印sBuffer的内容

    }

}

运行结果如下:

abcde-----klmnopqrstuvwxyz

zyxwvutsrqponmlk-----edcba

5.2.4  append( )方法

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

5.2.5  插入和删除

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的字符串中删除从startend的子串。

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

5.2.6  StringBuffer类的其他方法

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类的相似,这里不一一枚举。