零基础学Java第2版
上QQ阅读APP看书,第一时间看更新

6.2 字符串处理的类库种类

字符串处理类使用最多的有两种:“String”类和“StringBuffer”类。下面将详细讲述这两个类如何使用。

6.2.1 字符串的赋值

字符串类是处理字符串的类。“String”字符串与上一章学过的数组有一个共同点。就是它们被初始化后,长度是不变的,并且内容也不变。如果要改变它的值,就会产生一个新的字符串,如下所示:

String str1="very";
str1=str1+"good";

这个赋值表达式看起来有点像简单的接龙。在“str1”后面直接加上一个“good”字符串,形成最后的字符串“very good”。其运行原理是这样的:程序首先产生了“str1”字符串对象,并在内存中申请了一段空间。此时要追加新的字符串是不可能的,因为字符串被初始化后,长度是固定的。如果要改变它,只有放弃原来的空间,重新申请能够容纳“very”和“good”两个字符串的内存空间,然后将“very good”字符串放到内存中。

6.2.2 字符串的处理类—String

字符串的声明非常简单,具体声明方法如下所示:

字符串类型 字符串名=字符串内容

例如:String str=“we are chinese”。

在后面类和对象中,会提到一个构造器的概念。构造器就是从类中构造出对象的方法。字符串类一共有9种不同的构造器,下面将详细讲述其中的6种。

1. 字符串类的默认构造器

“String()”这个构造器是最简单的构造器,也是系统默认的构造器,是不带参数的。

【实例6.3】下面通过实例来学习如何使用它。

01   ///创建一个空字符串str
02   ///因为是空字符串,所以输出也是没有内容的
03   public class str3
04   {
05         public static void main(String[] args)
06         {
07              String str=new String();
08              System.out.println(str);
09         }
10   }

【代码说明】第7行只初始化了一个字符串对象str,并没有为其赋值。

【运行效果】这个程序输出的结果为空,因为这个构造器构造出的对象是个空对象。

2. 字节参数的构造器

【实例6.4】“String(byte[] byte)”将字节数组中的元素作为字符串对象。请看下面的例子,再来体会这个构造器的作用。

01   ///初始化一个字节数组b
02   ///通过构造器,将字节数组中的元素连接成一个字符串
03   ///将此字符串输出
04   public class str4
05   {
06         public static void main(String[] args)
07         {
08              byte[] b={97,98,99};
09              String str=new String(b);
10              System.out.println(str);
11         }
12   }

【代码说明】这个构造器的作用是将字节数组中的元素以字符串对象的形式输出。

【运行效果】输出结果并不是数值97的字符串“97”,而是其ASCII码代表的字符a。读者可自己动手实验,结果如下所示。

abc

3. 获取指定字节数的构造器

“String(byte[] bytes,int offset,int length)”这个构造器的含义是:将字节数组中,从“offset”指定的位置开始,到“length”长度结束,中间的字符构成字符串对象。

【实例6.5】下面看一个简单的例子。

01   ///初始化一个字节数组b
02   ///通过构造器,将字节数组中的元素连接成一个字符串,并且从第4个位置开始,总共有2个元
03   ///素
04   ///将此字符串输出
05   public class str5
06   {
07         public static void main(String[] args)
08         {
09              byte[] b={97,98,99,100,101,102};
10              String str=new String(b,3,2);
11              System.out.println(str);
12         }
}

【代码说明】在“String”对象中,第一个参数“b”,就是指开始初始化的字符数组。第二个参数是3,就是指定从第4个位置开始,因为数组是从零开始的,所以3是指第4个位置即“4”。第三个参数是2,指定从这个位置开始后几个字符,因为是2,所以是从“4”开始的两个字符。

【运行效果】

de

4. 将字节型数据转换为字符集输出的构造器

“String(byte[] bytes,int offset,int length,String charsetName)”这个构造器的含义就是:将一个字节数组中从第“offset”个位置的字符开始,“length”长度的字符结束,中间的字符形成了字符串对象,然后将这个字符串按照某种字符集样式输出。

字符集一般有“us-ascii”、“iso-8859-I”、“utf-8”、“utf-16be”、“utf-16le”、“utf-16”等样式。

【实例6.6】下面先看看这种构造器的实例。

01   import java.io.*;
02   ///初始化一个字节数组b
03   ///通过构造器,将字节数组中的元素连接成一个字符串,并且从第4个位置开始,总共有2个元素
04
05   ///将此字符串以UTF-16的形式输出
06   public class str6
07   {
08         public static void main(String[] args)
09         {
10              byte[] b={97,98,99,100,101,102};
11              try
12              {
13                   String str=new String(b,3,2,"utf-8");
14                   System.out.println(str);
15              }
16              catch(UnsupportedEncodingException ex){}
17
18         }
19   }

【代码说明】其实这个构造器的用法与上一个构造器差不多,唯独不同的就是输出结果的形式不一样。“String(byte[] bytes,String charsetName)”与上一个构造器是同类的构造器,此构造器是将整个字节数组作为字符串对象,并以某个字符集形式输出。

【运行效果】

de

5. 字符数组的构造器

“String(char[] value)”构造一个字符数组,其实这个构造器与第二个构造器很相似,它是将字符数组内的字符连在一起,形成一个字符串。

【实例6.7】下面是这个构造器的实例。

01   ///初始化一个字符数组c
02   ///通过构造器,将字符数组中的元素连接成一个字符串
03   ///将此字符串输出
04   public class str7
05   {
06         public static void main(String[] args)
07         {
08              char[] c={'w','e','l','c','o','m','e'};
09              String str=new String(c);
10              System.out.println(str);
11         }
12   }

【代码说明】这个程序段要做的事情,就是将字符数组中所有的元素连起来形成一个字符串。

【运行效果】

welcome

6. 截取部分字符串数组内容的构造器

“String(char[] value,int offset,int count)”这个构造器的含义是:将字符数组中从“offset”指定的位置开始,“count”指定的数目结束,中间的字符连成字符串。

【实例6.8】下面是这个构造器的实例。

01   ///初始化一个字符数组c
02   ///通过构造器,将字符数组中的元素连接成一个字符串,并从第4个位置开始,总共有4个元素
03   ///将此字符串输出
04   public class str8
05   {
06         public static void main(String[] args)
07         {
08              char[] c={'w','e','l','c','o','m','e'};
09              String str=new String(c,3,4);
10              System.out.println(str);
11         }
12   }

【代码说明】第9行是截取字符串的意思,从第三个位置开始,因为数组位置从0开始,所以这里的3,其实就是从第四个字符c开始,截取4位。

【运行效果】

come

读者可以根据上面的构造器,自己编写一些代码来熟悉它们。

6.2.3 字符串处理的方法

字符串类拥有很多针对字符串操作的方法。在这里主要讲述串连接、提取子串、从字符串中分解字符、得到字符串的长度、测试字符串是否相等、查找特定字符串、从基本类型转换成字符串等。

1. 串连接

在Java语言中,有两种串连接的方法:一种是使用“+”,另一种是使用方法函数“concat(String str)”。

【实例6.9】下面分别来举例说明。

01   ///通过加号将两个字符串str1和str2连在一起
02   public class str9
03   {
04         public static void main(String[] args)
05         {
06              String str1="you";
07              String str2="welcome";
08              System.out.println(str1+" "+str2);
09         }
10   }

【代码说明】第8行通过“+”将str1和str2两个字符串连接在一起。

【运行效果】

you welcome

【实例6.10】上面实例使用了“+”号运算符来连接两个字符串,形成新的字符串。下面通过concat方法将两个字符串连接起来。

01   ///使用concat方法将两个字符串str1和str2连在一起
02   public class str10
03   {
04         public static void main(String[] args)
05         {
06              String str1="you";
07              String str2=" welcome";
08              System.out.println(str1.concat(str2));
09         }
10   }

【代码说明】第8行使用了concat()方法,str1先输出,然后是str2。

【运行效果】

you welcome

这个实例使用了“concat”方法来连接两个字符串,形成新的字符串。无论用哪种方法将两个字符串连接起来,都同样形成新的字符串。

【实例6.11】下面将演示一个稍微复杂点的程序段。

01   ///初始化两个字符数组c和c1
02   ///通过构造器构造一个从字符数组c第1个元素开始,共4个元素组成的字符串str1
03   ///通过构造器构造一个从字符数组c1第2个元素开始,共1个元素组成的字符串str2
04   ///通过concat方法将两个字符串str2和str1连在一起
05   public class str11
06   {
07         public static void main(String[] args)
08         {
09              char[] c={'c','h','i','n','e','s','e'};
10              char[] c1={'h','a','n','d','l','e'};
11              String str1=new String(c,0,4);
12              String str2=new String(c1,1,1);
13              System.out.println(str1.concat(str2));
14         }
15   }

【代码说明】第9~10行定义了两个字符数组。第11~12行通过构造器构造两个字符串对象。第13行使用concat()方法连接两个字符串。

【运行效果】

china

分析以上的程序段,首先利用构造器,构造了两个将字符数组连在一起的字符串。再在这两个字符串中提取新的字符串,最后再将两个字符串合并成新字符串。仔细分析这个程序,发现这个程序段是几个知识点的组合。所以读者编程时,一定将每个知识点弄清楚,这样编写代码就不再是件难事。

2. 提取子字符串

有时一个很长的字符串,其中只有一小部分是需要的,于是Java语言类库中,就提供了相应的获取局部字符串的方法。这些方法是:“substring(int beginIndex,int endIndex)”或“substring(int index)”。下面将详细地讲述这两个方法的意义和使用方法。

❑“substring(int index)”是指提取从index指定的位置开始,一直到字符串的最后。

❑“substring(int beginIndex,int endIndex)”是指提取由“beginIndex”位置开始,到以“endIndex”为结束位置的字符串。

【实例6.12】下面将举个如何提取子字符串的实例。

01   ///初始化一个字符串str
02   ///提取从字符串的第3个元素开始到第10个元素位置的字符串,并且将其输出
03   public class str12
04   {
05         public static void main(String[] args)
06         {
07              String str="we are students and he is worker";
08              System.out.println(str.substring(2,10));
09         }
10   }

【代码说明】第7行定义了一个字符串对象str,第8行使用substring(2,10)截取字符串的一部分。

【运行效果】

are stu

【实例6.13】下面再举个如何提取子字符串的例子。

01   ///初始化一个字符串str
02   ///提取从字符串的第4个元素开始到结束位置的字符串,并且将其输出
03   public class str13
04   {
05         public static void main(String[] args)
06         {
07              String str="we are students and he is worker";
08              System.out.println(str.substring(3));
09         }
10   }

【代码说明】第8行使用了substring(3),表示从第4个元素开始截取字符串。

【运行效果】

are students and he is worker

【实例6.14】其实提取子字符串的方法很简单,下面将看一个综合的例子。

01   ///初始化一个字符串str
02   ///通过循环语句,提取从字符串的第1个元素开始到结束位置的字符串,一直到从最后一个元素
03   ///到最后的字符串,并且将其输出
04   public class str14
05   {
06         public static void main(String[] args)
07         {
08              String str="we are students and he is a worker";
09              for(int i=0;i<34;i++)
10              {
11                   System.out.println(str.substring(i));
12              }
13         }
14   }

【代码说明】这个程序以循环语句输出从第一个位置到最后一个位置的子字符串。这个程序段的运行结果看起来很复杂,但这个程序原理非常简单。

【运行效果】

we are students and he is a worker
e are students and he is a worker
 are students and he is a worker
are students and he is a worker
re students and he is a worker
e students and he is a worker
 students and he is a worker
students and he is a worker
tudents and he is a worker
udents and he is a worker
dents and he is a worker
ents and he is a worker
nts and he is a worker
ts and he is a worker
s and he is a worker
 and he is a worker
and he is a worker
nd he is a worker
d he is a worker
 he is a worker
he is a worker
e is a worker
 is a worker
is a worker
s a worker
 a worker
a worker
 worker
worker
orker
rker
ker
er
r

3. 从字符串中分解字符

上面的方法是从字符串中提取子字符串,而将要讲述的是从字符串中提取一个指定的字符。从字符串中分解字符的方法是:“charAt(int index)”,这个方法返回的是一个字符,而不是字符串,这是跟前面方法的区别。参数“index”是指字符串序列中字符的位置。

【实例6.15】下面将举个实例演示如何使用此方法。

01   ///从字符串中第2个位置将字符提取出来
02   public class str15
03   {
04         public static void main(String[] args)
05         {
06              String str="we are students and he is a worker";
07              System.out.println(str.charAt(1));
08         }
09   }

【代码说明】这个程序段输出的是字符串第二个字符,因为字符串位置从零开始计算,所以输出的字符是“e”。

【运行效果】

e

4. 得到字符串的长度

在学习数组时,学到过数组长度,而在这里也要讲到字符串的长度。字符串长度使用方法“length()”获取。

注意

数组的长度是“length”,而字符串的长度是“length()”,数组的长度后面没有括号,得到的数组长度是一个属性值,而得到字符串长度是一个方法。

【实例6.16】看看下面的程序段。

01   ///输出字符串的长度
02   public class str16
03   {
04         public static void main(String[] args)
05         {
06              String str="we are students and he is a worker";
07              System.out.println(str.length());
08         }
09   }

【代码说明】第7行使用了length()方法直接输出str对象的长度。

【运行效果】

34

5. 测试字符串是否相等

在实际程序开发中,经常会出现一些比较字符串的程序模块,通过比较字符串是否相等,来实现某个要求。例如,通过比较两个字符串是否相等,来确认密码和用户名是否正确,从而判断是否可以登录系统。这个在系统登录界面中经常遇到。测试字符串是否相等的方法是“equals(String str)”。

【实例6.17】下面看一个具体的测试字符串是否相等的实例。

01   ///通过比较字符串str和str1两个字符串是否相同,来确定不同的输出
02   ///如果相同则输出"密码正确,请登录系统"
03   ///否则输出"密码不正确,请重新输入密码"
04   public class str17
05   {
06         public static void main(String[] args)
07         {
08              String str="administrator";
09              String str1="administrator";
10              if (str.equals(str1))
11                   {System.out.println("密码正确,请登录系统");}
12              else
13                   {System.out.println("密码不正确,请重新输入密码");}
14         }
15   }

【代码说明】第8~9行是两个字符串。第10行是判断语句,通过equals()方法判断两个指定的字符串是否相等。

【运行效果】

密码正确,请登录系统

在现实程序开发中,有的登录系统对于输入密码的大小写忽略。此时在Java语言中也有一个方法就是“equalsIgnoreCase(String str)”,这个方法忽略字符串大小写。

【实例6.18】下面看一个程序段的例子。

01   ///通过比较字符串str和str1两个字符串是否相同,来确定不同的输出,此时忽略大小写
02   ///如果相同则输出"密码正确,请登录系统"
03   ///否则输出"密码不正确,请重新输入密码"
04   public class str18
05   {
06         public static void main(String[] args)
07         {
08              String str="Administrator";
09              String str1="administrator";
10              if (str.equalsIgnoreCase(str1))
11                   {System.out.println("密码正确,请登录系统");}
12              else
13                   {System.out.println("密码不正确,请重新输入密码");}
14         }
15   }

【代码说明】第8~9行定义了两个字符串,它们的不同就是首字母是否大小写。第10行使用了equalsIgnoreCase()方法来进行判断。

【运行效果】

密码正确,请登录系统

以上的程序段是使用了忽略大小写的方法,比较两个字符串是否相等。

【实例6.19】下面将通过不忽略大小写的方法编写代码,并与上例相比较。

01   ///通过比较字符串str和str1两个字符串是否相同,来确定不同的输出,此时不忽略大小写
02   ///如果相同则输出"密码正确,请登录系统"
03   ///否则输出"密码不正确,请重新输入密码"
04   public class str19
05   {
06         public static void main(String[] args)
07         {
08              String str="Administrator";
09              String str1="administrator";
10              if (str.equals(str1))
11                   {System.out.println("密码正确,请登录系统");}
12              else
13                   {System.out.println("密码不正确,请重新输入密码");}
14         }
15   }

【代码说明】第8~9行是一个单词,不同的是首字母一个大写,一个小写。第10行的equals()方法在比较时并不忽略大小写,所以比较结果是false。

【运行效果】

密码不正确,请重新输入密码

6. 查找特定子串

在程序开发的过程中,有的系统提供查找子系统,用于查找自己需要的内容。在Java语言中,也提供了查找特定子串的功能,可以帮助查找自己需要的子字符串。

查找字符串子串有三个方法:

❑“indexOf(子串内容)”方法是帮助查找子串,如果返回的是负数,就表示在当前字符串中没有找到所查找的子串。

❑“startsWith(子串内容)”方法测试当前字符串是否以一个子串开始。

❑“endsWith(子串内容)”方法测试当前字符串是否以子串内容为结尾。

【实例6.20】下面看一下具体的程序段,通过实例读者会理解得更加透彻。

01   ///通过indexOf方法来查找字符串中的元素位置
02   ///通过endsWith来查找当前元素是否是字符串的结尾
03   ///通过startsWith来查找当前元素是否是字符串的开头
04   public class str20
05   {
06         public static void main(String[] args)
07         {
08              String str="是一个很优秀的程序员";
09              System.out.println(str.indexOf("个"));
10              System.out.println(str.endsWith("员"));
11              System.out.println(str.startsWith("明"));
12         }
13   }

【代码说明】str.indexOf(“个”)是测试字符串中的“个”这个子串的位置。str.endsWith(“员”)是测试字符串“员”是否是这个字符串的结尾。str.startsWith(“明”)是测试字符串“明”是否是这个字符串的开始。后面两个方法返回的是布尔型数据。

【运行效果】

2
true
false

7. 从基本类型转换成字符串

使用“valueOf()”将基本类型的数据转换成相应的字符串。由于这个方法很简单,读者在后面的程序中会看到,这里不作详细的解释。

8. toString()方法

为什么会把这个方法提出来讲述呢?因为它是程序开发语言中非常重要的字符串处理方法。

【实例6.21】复习下面的程序段。

01   public class str21
02   {
03         public static void main(String[] args)
04         {
05              String str="小明是一个很优秀的程序员";
06              System.out.println(str);
07         }
08   }

【代码说明】第5行定义一个字符串str,第6行直接输出str。

【运行效果】

小明是一个很优秀的程序员

为什么可以直接将这个对象作为输出的参数呢?因为在Java语言内含一种机制,系统默认会在这些对象后面自动加上“toString()”方法。在Java类库的基本类中,每一个类都有一个“toString()”方法,可以将这个方法写出来,也可以直接使用对象来代替“toString()”方法。

【实例6.22】下面来看看这个方法的实际例子。

01   ///通过toString方法来输出对象的字符串形式
02   public class str22
03   {
04         public static void main(String[] args)
05         {
06              String str="小明是一个很优秀的程序员";
07              System.out.println(str.toString());
08         }
09   }

【代码说明】其实上面的程序段与前面的程序段输出一模一样。它们之间唯一不同的是,在输出语句中一个是把对象作为参数,将其内容输出。而上面的程序段则是直接运用“toString()”方法,将对象中的字符串提取出来,然后再进行输出。

【运行效果】

小明是一个很优秀的程序员

对于Java语言的类库来说,一般可以省去“toString()”方法,但如果是自己设计的类,最好加上这个方法,养成良好的编程习惯。

6.2.4 缓冲字符串处理类—StringBuffer

前面介绍过,“String”类一旦声明初始化后,是固定不变的。如果要改变它,就必须重新申请空间,重新声明和初始化。Java类库中有一个类,可以解决上面的问题,那就是缓冲字符串类—“StringBuffer”类。

当创建StringBuffer类对象时,系统为对象分配的内存会自动扩展,以容纳新增的内容。针对“StringBuffer”类创建对象时的构造器有两个,下面将详细地讲述。

6.2.5 缓冲字符串StringBuffer类的构造器

在这一小节中,将学习缓冲字符串类的构造器知识。通过学习来对比StringBuffer类和String类的不同点和相同点。

1. 默认的构造器

StringBuffer sb=new StringBuffer();

默认构造器是由系统自动分配容量,而系统容量默认值是16个字符。

【实例6.23】下面来看这个默认构造器的实例。

01   ///输出字符串的容量capacity
02   ///输出字符串的长度length
03   public class str23
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb1=new StringBuffer();
08              System.out.println(sb1.capacity());
09              System.out.println(sb1.length());
10         }
11   }

【代码说明】这个程序段要说明的是,缓冲字符串对象的容量和缓冲字符串的长度。缓冲字符串的容量,就是指在刚刚创建对象时,系统分配的内存容量的大小。缓冲字符串的长度,则是指实际缓冲字符串对象的内存空间中,字符串的长度。在这个程序中,由于是默认的构造器,所以它的容量也是默认的,即16。由于它没有赋值,所以这个缓冲字符串对象的长度就是0。

【运行效果】

16
0

2. 设定容量大小的构造器

StringBuffer sb=new StringBuffer(int x)

“x”是设置容量的大小值。

【实例6.24】例如下面的语句。

01   ///输出字符串的容量capacity
02   ///输出字符串的长度length
03   public class str24
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb1=new StringBuffer(100);
08              System.out.println(sb1.capacity());
09              System.out.println(sb1.length());
10         }
11   }

【代码说明】这里通过构造器设定了缓冲字符串对象的容量。虽然容量改变了,但长度仍然是零,因为它的内存空间中没有值。“capacity()”方法代表了字符串对象在内存中,可以容纳字符串的个数。如果想要扩充内存容量,可以使用方法“ensureCapacity()”。方法“length()”表示内存中已经存在的字符串的个数,如果想要改变字符串长度,可以使用“setLength()”方法。

【运行效果】

100
0

【实例6.25】下面看一个缓冲字符串实例。

01   ///输出字符串的容量capacity
02   ///输出字符串的长度length
03   public class str25
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer(40);
08              System.out.println(sb.capacity());
09              sb.ensureCapacity(100);
10              System.out.println(sb.capacity());
11         }
12   }

【代码说明】这里通过构造器设定了缓冲字符串对象的容量,第一次是40。第9行使用方法“ensureCapacity()”扩充内存容量到100。

【运行效果】

40
100

6.2.6 缓冲字符串处理的方法

下面将学习StringBuffer类的一些主要方法。其实这些方法有很多与String类的方法很相似,通过学习可以进行比较。

1. 初始化字符串

StringBuffer sb=new StringBuffer(字符串);

使用这种形式的构造器,可以构建具有初始化文本的对象,容量大小就是字符串的长度。一旦创建了“StringBuffer”类的对象,就可以使用“StringBuffer”类的大量方法和属性。“StringBuffer”类最常用的是“append()”方法,它将文本内容添加到现有的“StringBuffer”对象内存中字符串的结尾处。

【实例6.26】下面看看这个方法应用的实例。

01   ///构造一个缓冲字符串类的对象
02   ///通过append方法,在这个对象后面添加一个新字符串
03   public class str26
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("小明是一个优秀");
08              sb.append("的程序员");
09              System.out.println(sb);
10         }
11   }

【代码说明】第8行使用append()方法将两个字符串连接在一起,有点像String类的concat()方法。

【运行效果】

小明是一个优秀的程序员

【实例6.27】前面讲了“setLength()”方法,现在通过实例了解其用法。

01   ///构造一个缓冲字符串类的对象
02   ///通过append方法,在这个对象后面添加一个新字符串
03   ///通过setLength方法来设置缓冲字符串对象的长度
04   public class str27
05   {
06         public static void main(String[] args)
07         {
08              StringBuffer sb=new StringBuffer("小明是一个优秀");
09              sb.append("的程序员");
10              sb.setLength(3);
11              System.out.println(sb);
12         }
13   }

【代码说明】第8行定义了字符串sb,第9行将两个字符串连接起来,此时字符串的长度是11。第10行指定字符串长度是3,所以读者要注意输出结果。

【运行效果】

小明是

2. 取字符串的单个字符

charAt()方法返回字符串中的单个字符。

【实例6.28】下面是这个方法的实例。

01   ///构造一个缓冲字符串类对象
02   ///返回指定位置的字符
03   public class str28
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("小明是一个优秀");
08              System.out.println(sb.charAt(3));
09         }
10   }

【代码说明】第7行定义了字符串sb,第8行指定输出sb的第四个元素,因为索引时从0开始的,所以代码是charAt(3)。

说明

除特殊情况外,基本上所有的索引都是从0开始。

【运行效果】

3. 单个字符串赋值

setCharAt()方法对字符串中的单个字符赋值或进行替换。

【实例6.29】下面是这个方法的实例。

01   ///构造一个缓冲字符串类对象
02   ///将指定位置的元素替换成新的字符
03   public class str29
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("小明是一个优秀程序员");
08              sb.setCharAt(0,'张');
09              System.out.println(sb);
10         }
11   }

【代码说明】“setCharAt()”方法使用的格式是“setCharAt(int index,char ch)”。上面的实例将字符串中的“小”替换成“张”。

【运行效果】

张明是一个优秀程序员

4. 指定位置插入字符串

insert()方法在字符串指定位置插入值。

【实例6.30】下面学习一个实例。

01   ///构造一个缓冲字符串类对象
02   ///使用insert方法将新字符串插入到指定的位置上
03   public class str30
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("我是一个优秀");
08              sb.insert(6,"的程序员");
09              System.out.println(sb);
10         }
11   }

【代码说明】第8行的结构就是“insert(int index,string str)”。最终的结果其实是连接了两个字符串,因为指定的位置正好是字符串sb的结束位置。

【运行效果】

我是一个优秀的程序员

上面的这个例子有点像“append()”方法。

【实例6.31】下面再看一个实例。

01   ///构造一个缓冲字符串类对象
02   ///使用append方法连接字符串
03   public class str32
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("我是一个优秀的");
08              sb.append("程序员");
09              System.out.println(sb);
10         }
11   }

【代码说明】第8行使用了“append()”方法实现了和上一个实例相同的功能。

【运行效果】

我是一个优秀的程序员

5. 返回字符串的子串

substring()方法返回字符串的一个子串。

【实例6.32】下面是这个方法的实例。

01   ///构造一个缓冲字符串类对象
02   ///使用substring方法返回指定位置开始到结束位置的子串
03   public class str33
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("我是一个程序员");
08              System.out.println(sb.substring(2));
09         }
10   }

【代码说明】这个程序段返回的是,从字符串的第三个位置开始,到最后位置之间的子字符串。

【运行效果】

一个程序员

【实例6.33】针对这个方法,再看看下面的实例。

01   ///构造一个缓冲字符串类对象
02   ///使用substring方法返回指定位置开始到另一个指定位置结束的子串
03   public class str34
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("我是一个程序员");
08              System.out.println(sb.substring(2,7));
09         }
10   }

【代码说明】其实这个方法同“String”类中的方法用法相同。返回从开始位置到结束位置之间的字符串。

【运行效果】

一个程序员

6. 倒置字符串的内容

reverse()方法用来倒置“StringBuffer”的内容。

【实例6.34】下面针对这个方法看一个实例。

01   ///构造一个缓冲字符串类对象
02   ///将字符串倒置后输出
03   public class str35
04   {
05         public static void main(String[] args)
06         {
07              StringBuffer sb=new StringBuffer("我是一个程序员");
08              System.out.println(sb.reverse());
09         }
10   }

【代码说明】这段代码比较简单,第8行直接调用reverse()方法,不需要任何参数。

【运行效果】

员序程个一是我

6.2.7 缓冲字符串类的特点

字符串是绝大多数应用程序经常使用且不可缺少的对象之一。由于缓冲字符串类有着比字符串类更加宽裕的空间,所以缓冲字符串可以用来处理一些动态字符串,而一般字符串类只能处理静态的不可变化的字符串。