在Java语言中,String对象被创建成功后,它的长度和内容都不能再改变。对String对象使用赋值和连接运算符改变内容时,都会在内存中产生一个新的String对象。如果对String对象多次进行连接或赋值操作,会导致程序占用较多内存,系统开销增大,这种情况是要尽量避免的。
Java API库提供了StringBuilder类,来解决字符串多次修改的问题。StringBuilder类允许程序频繁修改字符串内容,而不会在内存中创建新的字符串对象。StringBuilder类修改字符串内容的主要操作方法如下:
(1)append()方法
append()方法用于添加内容到字符串生成器,它是重载方法,它可以添加不同数据类型的内容到字符串生成器,如String、CharSequence、char、double、int、float等类型。
调用语法如下:
builder. append(content)
其中,builder是已创建的StringBuilder对象。content是指要添加的内容,它可以是任何类型的数据或类对象。
(2)insert()方法
insert()方法用于向字符串生成器的指定位置插入内容,它也是重载方法,它可以插入不同数据类型的内容到字符串生成器。
调用语法如下:
builder. insert(int offset, content)
其中,builder是已创建的StringBuilder对象。offset是字符串生成器的索引位置,在该索引位置插入content。content可以是任何类型的数据或类对象。
(3)delete(int statr int end)方法
delete()方法用于从字符串生成器中删除指定索引范围内的子串。该子串从指定的start开始,一直到索引end-1处的字符,如果end索引不存在,则到字符串生成器的尾部。如果start和end相等,该方法不做任何操作。
案例1:创建StringBuilder对象和String对象,在循环结构中使用StringBuilder对象的append()方法添加字符串,使用“+=”运算符为String对象添加字符串,验证String类和StringBuilder类添加字符串的效率。
在PbaseUnit11项目unit包下创建StringBuilderSample类。代码如下:
/**
* @Title: StringBuilderSample.java
* @Package unit
* @Description: Java基础知识课程案例
* @author 编程训练营
* @date
* @version V1.0
*/
package unit;
/**
* @ClassName: StringBuilderSample
* @Description: 字符串(字符串生成器)案例1
* @author 编程训练营
* @date
*
*/
public class StringBuilderSample {
/**
* @Title: main
* @Description:Java程序入口main方法
* @param @param args 参数
* @return void 返回类型
* @throws
*/
public static void main(String[] args) {
// 创建String对象
String szTemp = "";
// 创建StringBuilder对象
StringBuilder builder = new StringBuilder();
//获取操作前时间(毫秒数)
long startTime = System.currentTimeMillis();
// 循环10000次,循环追加字符串
for( int i = 0 ; i < 100000; i++ )
{
szTemp += i;
}
//获取操作后时间(毫秒数)
long endTime = System.currentTimeMillis();
// 计算szTemp追加字符串操作时间
long nTime = endTime - startTime;
System.out.println("String消耗时间:"+ nTime);
//获取操作前时间(毫秒数)
startTime = System.currentTimeMillis();
// 循环10000次,循环追加字符串
for( int i = 0 ; i < 100000; i++ )
{
builder.append(i);
}
//获取操作后时间(毫秒数)
endTime = System.currentTimeMillis();
// 计算builder追加字符串操作时间
nTime = endTime - startTime;
System.out.println("StringBuilder消耗时间:"+ nTime);
}
}程序结构分析
程序分别创建了String对象和StringBuilder对象。程序设置两轮循环,循环次数为100000次,在每轮循环开始前,调用System.currentTimeMillis()方法获取循环前时间,循环结束后获取循环后时间,用于计算循环耗费的时间并输出。在第一轮循环体内,szTemp对象使用“+=”运算符追加循环变量i的值;在在第二轮循环体内builder对象调用append()方法追加循环变量i的值。
程序执行结果如下图所示:
从执行结果可以看出,StringBuilder类和String类操作字符串的效率差别很大,当在程序中频繁使用附加字符串时,建议使用StringBuilder类,当附加字符串操作结束后,可以使用StringBuilder类的toString()方法返回一个String对象。