处理文本值是程序员的日常工作通常用标准的Java String类来完成与文本有关的需求它对于很多小任务确实很适用但是如果处理的是大型任务它会大量消耗系统资源由于这个原因JDK引入了StringBuffer类以提供一条处理字符串的有效路径让我们来看看怎样用这个类来提升性能
为什么不用标准的String?
Java String对象是常量字符串一旦被初始化和付值它的值和所分配的内存就被固定了如果硬要改变它的值将会产生一个包含新值的新String对象这就是String对象会消耗掉很多资源的原因下面的代码创建了一个String对象并使用串联(+)符号来为它添加更多字符
String sample=new String();
sample+=is;
sample+=the place;
sample+=to be;
系统最终会创建四个String对象来完成上面的替换其中第一个的文本是然后每次添加文本时都会创建一个新的对象
这种方法的问题在于为了这么一个简单的过程而消耗了太多的资源在这个例子中其影响也许很小(指给出了很少的代码)但是在一个拥有多得多操作的大型应用程序中这样做就会使性能下降StringBuffer类所要解决的正是这个问题
用StringBuffer处理字符串
StringBuffer类被设计用与创建和操作动态字符串信息为该对象分配的内存会自动扩展以容纳新增的文本有三种方法来创建一个新的StringBuffer对象使用初始化字符串设定大小以及使用默认构造函数
StringBuffer sb=new StringBuffer();
StringBuffer sb=new StringBuffer();
StringBuffer sb=new StringBuffer();
第一行创建了不包含任何文本的对象默认的容量是个字符类的第二个实例也不包含文本容量是个字符最后一行创建了一个拥有初始化值的对象StringBuffer类位于javalang基础包中因此要使用它的话不需要特殊的引入语句
一旦创建了StringBuffer类的对象就可以使用StringBuffer类的大量方法和属性最显着的方法是append它将文本添加到当前StringBuffer对象内容的结尾下面的代码示例了append方法的语法
StringBuffer sb=new StringBuffer();
sbappend(B);
sbappend(u);
sbappend(i);
sbappend(l);
sbappend(d);
sbappend(e);
sbappend(r);
sbappend();
Systemoutprintln(sbtoString());
这些代码创建了字符串并将它送往标准输出但是只创建了一个对象如果使用String对象就需要八个以上的对象注意代码利用了StringBuffer类的toString方法这个方法将其内容转换成一个可以被用于输出的字符串对象它允许操作对应的文本用于输出或数据存储
append方法有十种重载形式允许将各种类型的数据添加到对象的末尾StringBuffer类还提供了处理对象内部数据的方法
StringBuffer的容量
可以使用capacity和length方法来设定对象内的字符数capacity方法返回为对象分配的字符数(内存)如果超过了容量它会自动扩展以符合需求length方法返回对象目前存储的字符数可以通过setLength方法来增加其长度另外对象的容量可以通过ensureCapacity方法来扩展它建立了对象的最小容量因此如果超出则不会有任何问题下面的代码用到了这些方法
StringBuffer sb=new StringBuffer();
sbensureCapacity();
sbappend( is awesome!);
Systrmoutprintln(sbtoString());
sbsetLength();
Systrmoutprintln(sbtoString());
代码设置了字符串的容量并为其付值length属性被重新设置了因此文本被截断了输入结果如下
is awesome!
操作字符串
还有更多的方法来处理存储在StringBuffer对象内的字符串以下列举了几个例子
CharAt返回字符串中的单个字符
SetCharAt为字符串中的单个字符付值或进行替换
GetChars返回字符串的一个子字符串
Insert在字符串指定位置插入值它有多个重载版本以容纳各种数据类型
Substring返回字符串的一个子集
Reverse倒置StringBuffer的内容
所有的方法对于操作值来说都是很有用的但是reverse方法最酷了——它使你只用一个调用就轻松地倒置了一个字符串下面的代码和数出结果作了示范
StringBuffer sb=new StringBuffer();
sbensureCapacity();
sbappend(!);
Systemoutprintln(sbtoString());
sbreverse();
Systrmoutprintln(sbtoString());
输出
!
!mocredliuB
StringBuffer的优势
字符串的使用贯穿于决大多数应用程序不管是作为用户界面的标识或在后台处理从数据库取回的值通常这些值并不符合要求需要处理你可以使用String类但是它并不是设计成处理动态值的而StringBuffer类正好填补了这个需求并使得系统资源的利用更加有效