字符串生成器
创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用 “+” 可以达到附加新字符或字符串的目的,但 “+” 会产生一个新的 String 实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大地增加系统开销。而 JDK 新增了可变的字符序列 StringBuilder 类,大大提高了频繁增加字符串的效率。
【例10.18】效率比拼(实例位置:资源包\TM\sl\10\18)
在项目中创建 Jerque 类,先使用 “+” 运算符把 0~9999 逐一地拼接成字符串,再把 0~9999 逐一地追加到 StringBuilder 类的对象中,在控制台上分别输出这两种方式的消耗时间。实例代码如下:
public class Jerque { // 新建类
public static void main(String[] args) { // 主方法
String str = ""; // 创建空字符串
// 定义对字符串执行操作的起始时间
long starTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) { // 利用for循环执行10000次操作
str = str + i; // 循环追加字符串
}
long endTime = System.currentTimeMillis(); // 定义对字符串操作后的时间
long time = endTime - starTime; // 计算对字符串执行操作的时间
System.out.println("String消耗时间:" + time); // 将执行的时间输出
StringBuilder builder = new StringBuilder(""); // 创建字符串生成器
starTime = System.currentTimeMillis(); // 定义操作执行前的时间
for (int j = 0; j < 10000; j++) { // 利用for循环进行操作
builder.append(j); // 循环追加字符
}
endTime = System.currentTimeMillis(); // 定义操作后的时间
time = endTime - starTime; // 追加操作执行的时间
System.out.println("StringBuilder消耗时间:" + time); // 将操作时间输出
}
}
运行结果如图10.23所示。

通过这一实例可以看出,两种操作执行的时间差距很大。如果在程序中频繁地附加字符串,建议使用 StringBuilder 类。新创建的 StringBuilder 对象初始容量是 16 个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则 StringBuilder 对象将自动增加长度以容纳被附加的字符。若要输出 StringBuilder 对象中存储的字符,可使用 toString() 方法。利用 StringBuilder 类中的方法可动态地执行添加、删除和插入等字符串的编辑操作。该类的常用方法如下。
append()方法
该方法用于向字符串生成器中追加内容。通过该方法的多个重载形式,可实现接收任何类型的数据,如 int、boolean、char、String、double 或者另一个字符串生成器等。语法如下:
append(content)
其中,content 表示要追加到字符串生成器中的内容,可以是任何类型的数据或者其他对象。
insert(int offset, arg)方法
该方法用于向字符串生成器中的指定位置处插入数据内容。通过该方法的不同重载形式,可实现向字符串生成器中插入 int、float、char 和 boolean 等基本数据类型的数据或其他对象。语法如下:
insert(int offset arg)
-
offset:字符串生成器的位置。该参数必须大于或等于 0,且小于或等于此序列的长度。
-
arg:被插入字符串生成器的指定位置处的内容。该参数可以是任何数据类型的数据或其他对象。向字符串生成器中的指定位置处插入字符,代码如下:
StringBuilder bf = new StringBuilder("hello"); // 创建字符生成器
bf.insert(5, "world"); // 在字符串生成器中的指定位置处插入指定内容
System.out.println(bf.toString()); // 此时输出信息为 helloworld
delete(int start , int end)方法
移除此序列的子字符串中的字符。该子字符串从序列的索引(start)开始,到索引(end -1)结束。如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改。语法如下:
delete(int start, int end)
-
start:将要删除的字符串的起点位置。
-
end:将要删除的字符串的终点位置。
删除指定位置的子字符串,代码如下:
StringBuilder bf = new StringBuilder("StringBuilder"); // 创建字符串生成器
bf.delete(5, 10); // 删除的子字符串
System.out.println(bf.toString()); // 此时输出的信息为 Strinder
想要了解更多 StringBuilder 类的方法,可查询 java.lang.StringBuilder 的 API 说明。 |
编程训练(答案位置:资源包\TM\sl\10\编程训练)
【训练13】给字符串加标点符号 给字符串 “熊出没小心” 加上标点符号(熊出没,小心;熊出,没小心)。
【训练14】屏蔽手机号中间四位的值 屏蔽手机号中间四位的值,例如 “133****9865”。