字符串生成器

创建成功的字符串对象,其长度是固定的,内容不能被改变和编译。虽然使用 “+” 可以达到附加新字符或字符串的目的,但 “+” 会产生一个新的 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所示。

image 2024 03 01 15 58 00 267
Figure 1. 图10.23 例10.18的运行结果

通过这一实例可以看出,两种操作执行的时间差距很大。如果在程序中频繁地附加字符串,建议使用 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”。