Java 里的字符串处理类StringBuffer简介

来源:互联网 发布:cvf命令报错 linux 编辑:程序博客网 时间:2024/05/08 16:41

一, 什么是StringBuffer 和 为何需要StringBuffer

http://blog.csdn.net/nvd11/article/details/19552449

本人在上篇介绍String 类 的博文里提过:  

String类 是代表字符串的类, 但是String类指向的字符串是常量是不可修改的.

而且String类本身没有提供类似 insert, delete, set等修改字符串的方法.


例如:

1个String对象的值是abcde

String s = "abcde";

如果想把第4个字符("d")删掉.

String是没有提供类似 delete(int charIndex)的方法的.

当然, 程序猿可以用

String s2 = s.replace(s.substring(3,4), "");

来解决问题.

但是, 上面的语句实际上在内存堆区里划分了两个额外的String对象空间. 而且如果有多个相同的字符的话"d", 就会出错.


所以如果只用String类来处理字符串的话, 不但实现起来比较复杂, 而且很耗费时间和空间(内存).


更何况有些字符处理需求只用String类很难实现, 例如在第1个b后面插入一段字符串..


所以Java提供了另一个类StringBuffer让程序猿更方便地进行字符串处理.

String类实际之上指向数据区的字符串常量.

而StringBuffer会把字符串当做字符数组在堆区处理, 所以StringBuffer的内容是可以修改的.


而且StringBuffer 提供了相当多的字符串修改函数, 如果一个java程序经常处理字符串, 建议使用StringBuffer类.

StringBuffer可以通过toString()函数返回1个String对象函数.


二, StringBuffer的常用构造函数.

1.

public StringBuffer()

这种无参的构造函数代表创建1个空的,没有任何字符的StringBuffer对象.


2.

public StringBuffer(int capacity)

构造1个空的, 没有任何字符串的StringBuffer对象, 但是具有长度为capacity的初始容量.  而上面那个无参构造方法的初始容量为0.

如果capacity 参数小于0则抛出异常.


注意

Capacity 指的的是StringBuffer可以存放的字符长度, 而不是当前字符长度length(), 如果length超过capacity, 则该对象在内存里必须重新动态分配,获得更大的capacity.

类似于c语言的malloc 与realloc函数.


3.

public StringBuffer(String str)

创建1个StringBuffer对象, 并将内容初始化为与String对象 str一样的字符序列.  其capacity为str.length() + 16.


这个是最常用的构造方法.


三, StringBuffer的常用方法.

1. public void setLegnth(int newLength)

将StringBuffer对象的当前长度设为新的长度newLength.

如果currentLength <= newLength,   则新的位置全部为"\0000", 亦即系Null值.

如果currentLength > newLength,  相当于该对象执行了substring(0,newLength - 1) ,被截断了.


例子:

package String_kng;public class StringBuffer_2{    public static void f(){        StringBuffer sb = new StringBuffer("InterMilan");        System.out.printf("length of sb is %d\n",sb.length());             System.out.printf("char[5] of sb is %c\n",sb.charAt(5));             try{            System.out.printf("char[10] of sb is %c\n",sb.charAt(10));             }catch(StringIndexOutOfBoundsException e){            System.out.printf("Index 10 is out of bounds\n");        }        sb.setLength(12);        System.out.printf("\nsb is %s\n",sb);             System.out.printf("length of sb is %d\n",sb.length());             System.out.printf("char[10] of sb is %c\n\n",sb.charAt(10));             sb.setLength(5);        System.out.printf("sb is %s\n",sb);                     try{            System.out.printf("char[5] of sb is %c\n",sb.charAt(5));             }catch(StringIndexOutOfBoundsException e){            System.out.printf("Index 5 is out of bounds\n");        }    }}

输出:

     [java] length of sb is 10     [java] char[5] of sb is M     [java] Index 10 is out of bounds     [java]      [java] sb is InterMilan     [java] length of sb is 12     [java] char[10] of sb is      [java]      [java] sb is Inter     [java] Index 5 is out of bounds



2. public StringBuffer insert(int offset, String str)

在指定位置(index 为 offset)插入一段字符. 返回修改后的StringBuffer对象引用,调用该方法的对象没被修改

注意insert 有另1个重载 insert(int offset, double d)   无非就是把double类型转成字符



3. public StringBuffer delete(int start, int end)


删除指定位置的字符, 并返回修改后的StringBuffer对象引用.



4. public StringBuffer append(....)

append函数具有多个重载, 也就是支持多种类型的参数.

append表示在尾部追加, sb.append(str)相当于sb.insert(sb.length(),str)


5. public StringBuffer reverse()

字符串倒置, 例如"Inter" 倒置后就是"retnI"


其余还有很多于String类一样的方法, 例如 substring, indexOf 等等, 不详细讲了, 可以参考我之前的介绍String类的文章.





0 0