StringBuffer与String的不同之处
StringBuffer类是线程安全的可变字符序列,一个类似于String类的字符串缓冲区,两者本质上是一样的,但StringBuffer类的执行效率要比String类快很多,而String类创建的字符串对象是不可修改的,StringBuffer类创建的对象是可修改的,且实体容量会随着存放的字符串增加而自动增加。
String只能赋值一次,每一次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说String本身是不可改变的。每一次改变String的字符串内容,都会在内存创建新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低java虚拟机的工作效率。如下图所示。
而StringBuffer不同,每次都是操作自身对象,而不是生成新的对象,其所占空间会随着字符内容增加而扩充,做大量的修改操作时,不会因产生大量匿名对象而影响系统性能,如下图所示:
下面讲解几个StringBuffer类用法:
1.创建StringBuffer类
创建一个新的StringBuffer对象必须用关键字new,而不能像String对象那样直接引用字符串常量。语法如下:
StringBuffer sbf = new StringBuffer(); //创建一个对象,无初始值
StringBuffer sbf = new StringBuffer("abc"); //创建一个对象,初始值为“abc”
StringBuffer sbf = new StringBuffer(32); //创建一个对象,初始容量为32个字符
2.append()方法
append()方法可将参数转换成字符串,然后追加到此序列中,语法如下:
- sbf.append(obj)
- obj:任意数据类型对象,例如String、int、double、Boolean等,都转变成字符串的表示形式
使用append()方法分别来追加字符常量,其他StringBuffer对象和整数变量,输出最后拼接结果,代码如下:
public class HelloJava {
public static void main(String[] args) {
//创建StringBuffer对象
StringBuffer sbf = new StringBuffer("门前大桥下,");
//追加字符串常量
sbf.append("游过一群鸭,");
//创建其他StringBuffer对象
StringBuffer tmp = new StringBuffer("快来快来数一数,");
//追加StringBuffer对象
sbf.append(tmp);
//创建整数变量
int x = 24678;
sbf.append(x);
System.out.println(sbf);
}
}
返回结果:
门前大桥下,游过一群鸭,快来快来数一数,24678
3.setCharAt()方法
将给定索引处的字符修改为ch,语法如下:
- sbf.setCharAt(index,ch)
- index:被替换字符的索引
- ch:替换后的字符
创建一个手机号,将索引为3~6的字符修改成X,代码如下:
public class HelloJava {
public static void main(String[] args) {
//创建一个StingBuffer对象,一个手机号
StringBuffer phone = new StringBuffer("18310014567");
System.out.println("原手机号:" + phone);
//记录索引3~6
for(int i=3;i<=6;i++) {
//把索引3~6的字符改为“X”
phone.setCharAt(i, 'X');
}
System.out.println("更改完后的手机号:" + phone);
}
}
返回结果:
原手机号:18310014567
更改完后的手机号:183XXXX4567
4.inser()方法
将字符串str插入到指定索引值offset位置上,语法如下:
- sbf.insert(offset,str)
- offset:插入的索引
- str:插入的字符串
创建一个StringBuffer对象,在索引6的位置插入字符串‘’七‘’,代码如下:
public class HelloJava {
public static void main(String[] args) {
//创建一个StingBuffer对象,一个手机号
StringBuffer sbf = new StringBuffer("一二三四五六八");
System.out.println("原字符串:" + sbf);
//插入字符七
sbf.insert(6, "七");
System.out.println("在索引位置6插入一个字符‘七’:" + sbf);
}
}
返回结果:
原字符串:一二三四五六八
在索引位置6插入一个字符‘七’:一二三四五六七八
5.delete()方法
delete()方法可移除此序列的子字符串中的字符,该子字符串是从指定的索引start处开始,一直到索引end-1处,如果end-1超出最大索引范围,则一直到序列尾部,如果start等于end,则不发生任何更改,语法如下:
- sbf.delete(start,end)
- start:起始索引(包含)
- end:结束索引(不包含)
使用StringBuffer的delete方法将带有数字的字符串去掉,代码如下:
public class HelloJava {
public static void main(String[] args) {
//创建StringBuffer对象,包含字母和数字
StringBuffer sbf = new StringBuffer("ABC1234DEFG");
System.out.println("原字符串:" + sbf);
//去除掉字符串数字
sbf.delete(3, 7);
System.out.println("更改后的字符串:" + sbf);
}
}
返回结果:
原字符串:ABC1234DEFG
更改后的字符串:ABCDEFG
6.其他的用法
除了几个常用方法以外,StringBuffer类中还有类似String类的方法,下面通过一个实例演示如何使用StringBuffer类中的方法。
public class HelloJava {
public static void main(String[] args) {
//创建StringBuffer对象
StringBuffer sbf = new StringBuffer("ABCDEFG");
//输出原值
System.out.println("sbf的原值为:" + sbf);
//获取字符串序列的长度
int length = sbf.length();
System.out.println("sbf的长度为:" + length);
//获取索引为5的字符
char chr = sbf.charAt(5);
System.out.println("索引为5的字符为:" + chr);
//获取DEF字符串所在的索引位置
int index = sbf.indexOf("DEF");
System.out.println("DEF字符串的索引位置为:" + index);
//截取从索引0开始至索引2之间的字符串
String substr = sbf.substring(0,2);
System.out.println("索引0开始至索引2之间的字符串为:" + substr);
//将从索引2开始至索引5之间的字符序列替换成“1234”
StringBuffer tmp = sbf.replace(2, 5, "1234");
System.out.println("替换后的字符为:" + tmp);
}
}
返回结果:
sbf的原值为:ABCDEFG
sbf的长度为:7
索引为5的字符为:F
DEF字符串的索引位置为:3
索引0开始至索引2之间的字符串为:AB
替换后的字符为:AB1234FG