1、StringBuffer与String的关系
A、是两个不同的类,String实例一旦创建完毕,就不能再修改起内容。而StringBuffer实例则可修改实例所包含的字符序 列。
B、两者间的转换:
*从一个StringBuffer实例可以通过类String的构造方法构造出一个具有相同字符序列的String实例。
格式如下:new String(StringBuffer实例的引用);
另外还可以通过StringBuffer的成员方法来完成相同的转化。
例如:public String toString();
设b为StringBuffer类型的变量,则:String s=String(b);与String s=b.toString();具有相同效果,均会生成与b所指向的StrngBuffer实例内容相同的String实例,并将其指向String变量s。
*反过来,从String实例也可以构造出相应的具有相同字符序列的StringBuffer实例。其方法是通过StringBuffer的构造方法:
public StringBuffer(String str)
例如:StringBuffer b=new StringBuffer("abcd");
2、修改StringBuffer实例内容
A、通过StringBuffer的成员方法 public int length() 获得StringBuffer实例的字符串长度。
B、通过StringBuffer的成员方法:public char charAt(int index)得到字符序列中指定下标的字符。
C、通过StringBuffer的成员方法:public void setCharAt(int index,char ch)可以将StringBuffer实例的字符序列中指定下标的字符设置为指定的字符。
例如:StringBuffer b=new StringBuffer("that");
b.setCharAt(0,'c');//将b所指向的StringBuffer势力的字符序列从that变为char
D、几种常用的修改StringBuffer实例的成员方法
*append:在字符串序列之后添加新的内容
例如:StringBuffer b=new StringBuffer(“Pretty”);
b.append("good!");//b的字符序列变为Pretty good!
*delete:删除字符串序列中指定的子序列
例如:StringBuffer b=new StringBuffer(“Those”)
b.delete(2,4);//删除字符序列Those中的下标为2和3(4-1)的字符
*insert:在指定的位置给字符序列插入新的内容
例如:StringBuffer b=new StringBuffer(“1+=2”);
b.insert(2,1);//在“1+=2”的下标为2的字符之前插入整数1
*replace:替换指定的下标字符,声明方法为:public StringBuffer replace(int start,int end,String str)
例如:StringBuffer b=new StringBuffer(“25*??=625”);
b.replace(3,5,"25");//将指定的子串(从下标为start到下标为(end-1)的子串)替换成心子串
*reverse:将StringBuffer实例的字符序列变成其倒序的字符序列,声明方法为:public StringBuffer reverse()
例如:StringBuffer b=new StringBuffer(“Pretty”);
b.reverse();//将b所指向的StringBuffer实例的内容从Pretty变为ytterP
3、StringBuffer实例的容量:StringBuffer实例所占用的内存大小称为StringBuffer实例的容量。可以通过StringBuffer的成员方法public int capacity()获得其实例的容量。
A、StringBuffer具有三种构造方法,这三种构造方法生成的StringBuffer实例的容量大小如下表:
构造方法 |
字符序列长度 |
内存容量 |
public StringBuffer() |
0 |
16 |
Public StringBuffer(int length) |
0 |
Length |
public StringBuffer(String str) |
Str中的字符长度 |
Str中的字符序列长度加16 |
B、在当前的StringBuffer实例容量容纳不下变化后的字符序列时,StringBuffer实例会重新申请内存,提高内存容量。当调用了类StringBuffer的成员方法
public void ensureCapacity(int minimumCapacity)并且其中的参数minimymCapacity比当前的StringBuffer实例容量大的情况下,StringBuffer 实例也会重新申请内存,提高内存容量。新的内存容量是下面的两个参数中较大的数:①minimumCapacity;②(当前StringBuffer实例容量)*2+2。
在开发程序的时候,经常使用StringBuffer来进行字符串的拼接。如果在循环中来反复的做字符串拼接时,会清空Stringbuffer中的内容,然后再拼接新的字符串信息。
例如:
StringBuffer sb = new StringBuffer("");
for (UserInfo ui : userInfoList) {
sb = new StringBuffer("");
sb.append("姓名:");
sb.append(ui.getName());
sb.append(" ");
sb.append("年龄:");
sb.append(ui.getAge());
System.out.println(sb.toString());
}
在循环中使用sb = new StringBuffer("");来清空sb中的信息。
StringBuffer提供了以下连个方法:
1、delete(int start, int end)
移除此序列的子字符串中的字符
2、setLength(int newLength)
设置字符序列的长度。
测试程序:
private static void testStringBufferclear() {
StringBuffer sbf = new StringBuffer("wwwwww");
StringBuffer sbi = new StringBuffer("wwwwww");
long s1 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
sbi.setLength(0); sbi.setLength(0);
}
long s11 = System.currentTimeMillis();
System.out.println("StringBuffer-setLength:" + (s11 - s1));
s1 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
sbf.delete(0, sbf.length());
}
s11 = System.currentTimeMillis();
System.out.println("StringBuffer--delete:" + (s11 - s1));
s1 = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
sbf = new StringBuffer("");
}
s11 = System.currentTimeMillis();
System.out.println("StringBuffer--new StringBuffer:" + (s11 - s1));
}
结果:
StringBuffer-setLength:63
StringBuffer--delete:109
StringBuffer--new StringBuffer:78
结论:
要通过使用sbi.setLength(0);来清空StringBuffer对象中的内容效率最高。