一.(StringBuffer类):
由于字符串String是常量,一旦被创建,其内容和长度不可被修改。如果需要对一个字符串进行修改,只能创建新的字符串。为了对字符串进行修改,Java提供了一个StringBuffer类(字符缓冲区)。StringBuffer类和String类的最大区别在于它的长度和内容都是可以改变的。StringBuffer类似于一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,不会产生新的StringBuffer对象。
增:StringBuffer append(XXX) | 添加XXX到StringBuffer对象中 |
删一个字符:StringBuffer deleteCharAt(int index) | 删除下标为index处的字符 |
删一段字符或字符串序列:StringBuffer delete(int start,int end) | 删除下标以start开始,end-1结尾处的字符串序列(包头不包尾) |
改一个字符:void setCharAt(int index,char c) | 用字符c替换下标为index处的字符 |
改一个字符串:StringBuffer replace(int start,int end,String newStr) | 将指定范围的字符串替换成newStr(包头不包尾) |
插字符串:StringBuffer insert(int start,XXX) | 将XXX插入到下标为start的前面 |
String toString( ) | 返回StringBufffer缓冲区中的字符串 |
StringBuffer reverse() | 反转字符串序列 |
StringBuffer() | 空的可变序列 |
StringBuffer(String str) | 根据指定字符串创建可变序列 |
package StringBuffer和StringBuilder;
public class Demo1 {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("abcd");
sb.append(true);
System.out.println(sb);
sb.delete(2,5);//删除的2 3 4 下标的字符
System.out.println(sb);
sb.setCharAt(0,'F');
System.out.println(sb);
sb.replace(2,5,"ooo");
System.out.println(sb);
sb.insert(1,"mm");
System.out.println(sb);
}
}
二(StringBuilder类):
StringBuilder类是JDK5中新加的类,和StringBuffer之间的区别在于:StringBuilder的方法是线程不安全的,即StringBuffer不能被同步访问,而StringBuilderr可以同步访问。StringBuilder类的常见操作和StringBuffer类似,可以参考上面的StringBuffer类。
三(String类,StringBuffer类和StringBuilder类之间的效率测试):
package day1113;
/*
String StringBuffer StringBuilder效率对比
使用三个不同类型对字符串进行拼接
频繁对字符串进行增删改插操作的时候使用StringBuilder
*/
public class StringDemo02 {
public static void main(String[] args) {
/*
String效率测试
使用String拼接数字到200000
*/
long startTime=0;
long endTime=0;
String s1="";
//获取系统时间|:System.currentTimeMillis()---获取当前系统的毫秒值
startTime=System.currentTimeMillis();
for (int i=1;i<=200000;i++){
s1=s1+i;//字符串的拼接
}
endTime=System.currentTimeMillis();
System.out.println("使用String拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");
/*
StringBuffer效率测试
使用StringBuffer拼接数字1-200000
*/
StringBuffer sb1=new StringBuffer("");
startTime=System.currentTimeMillis();
for (int i=1;i<=200000;i++){
sb1.append(String.valueOf(i));//把i变成String然后再拼接
}
endTime=System.currentTimeMillis();
System.out.println("使用StringBuffer拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");
/*
StringBuilder效率测试
使用StringBuilder拼接数字1-200000
*/
StringBuilder sb2=new StringBuilder("");
startTime=System.currentTimeMillis();
for (int i=1;i<=200000;i++){
sb2.append(String.valueOf(i));//把i变成String然后再拼接
}
endTime=System.currentTimeMillis();
System.out.println("使用StringBuilder拼接数字1到200000花了"+(endTime-startTime)+"毫秒!");
}
}
从最终结果可看出,三者的工作效率为:StringBuilder>StringBuffer>String
四(StringBuffer和StringBuilder间的线程安全性与工作效率性对比):
StringBuffer | StringBuilder |
方法采用了加锁,线程安全 | 方法没有采用加锁,线程不安全 |
工作效率低 | 工作效率高 |
五(String类,StringBuffer类和Stringbuilder类之间的不同之处):
1.String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuffer类和StringBuilder类表示字符容器,其内容和长度都可以改变。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String类即可;如果需要对字符串中的字符进行添加或删除时,则应使用StringBuffer类或StringBuilder类;如果有大量字符串拼接操作时,在不要求线程安全的前提下,采用StringBuilder类更高效;若需要保证线程安全,则使用StringBuffer类。
2.String类重写了Object类的equals()方法,而StringBuffer类和StringBuilder类都没有重写Object类的equals()方法。
package StringBuffer和StringBuilder;
public class Demo3 {
public static void main(String[] args) {
String str1=new String("abc");
String str2=new String("abc");
boolean result=str1.equals(str2);
System.out.println("String中str1和str2:"+result);
StringBuffer str3=new StringBuffer("abc");
StringBuffer str4=new StringBuffer("abc");
boolean result1=str3.equals(str4);
System.out.println("StringBuffer中str3和str4:"+result1);
StringBuilder str5=new StringBuilder("abc");
StringBuilder str6=new StringBuilder("abc");
boolean result2=str5.equals(str6);
System.out.println("StringBuilder中str5和str6:"+result2);
}
}
3.String类对象可以用操作符“+”进行拼接,而StringBuffer类对象和StringBuilder类对象不能用操作符“+”进行拼接。