StringBuffer类

StringBuffer类

在讲解StringBuffer类之前回顾一个String类的特点:
一个字符串常量就是String类的匿名对象;
String类对象有两种实例化方式:
1.直接赋值:可以自动入池,只开辟一块内存空间
2.构造方法实例化,会开辟两块内存空间,其中一间成为垃圾。不会自动入池,可以使用intern()方法实现手工入池保存;

字符串内容一旦声明则不可改变。

正是因为字符串内容一旦声明则不可改变,所以如果在频繁修改字符串内容的程序上是不能使用String的,那么为此java之中提供有一个StrintBuffer类,而Sreint和StringBuffer类最大的特征在于:String类不可改变内容,而StringBuffer可以改变。
在String类之中使用“+”可以实现字符串连接操作,但是在StringBuffer类之中只能够使用append()方法实现字符串连接。
public StringBuffer append(数据类型 b)  既然返回值是StringBuffer就一直使用append()连接

范例:观察代码
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer buf=new StringBuffer();
buf.append("hello ").append("wordl").append("!!!");
fun(buf);
System.out.println(buf);
}
public static void fun(StringBuffer temp) {
temp.append("\n").addend("hello wordl");
}
}
此时在run()方法之中对StringBuffer类对象所做的修改可以影响原始对象,所以就可以得出结论:StringBuffer内容可以进行修改。

到此已经学习过了两个表示字符串的类:String,StringBuffer,那么这两个类有什么联系昵??

String                                                                       StringBuffer                                                                                          
public final class String public final class StringBuffer
extends Object extends Object
implements Serializable, Comparable<String>, CharSequence                                                           implements Serializable, CharSequence
发现String和StringBuffer两个类都是的CharSequence子类;那么就表示,如果见到某些方法上的参数或返回值类型是CharSequence,就应该想到是字符串
范例:利用CharSequence接收
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer buf=new StringBuffer();
buf.append("hello ").append("wordl").append("!!!");
CharSequence csA=bnf ;//StringBuffer实现CharSequence
CharSequence csB="HELLO ";//String实现CharSequence
System.out.println(csA);
System.out.println(csB);
}
}
但是虽然String和StringBuffer都是CharSequence子类;可是这两个类的对象并不可能直接进行转型。可是实际工作之中直接使用String和StringBuffer这两个子类居多,那么这两个类对象之间可以进行转型
1.String变为StringBuffer
利用StringBuffer类的构造方法:public StringBuffer(String str)
利用StringBuffer类的append()方法;public StringBuffer append(String str)

public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer bufA=new StringBuffer("HELLO");//String变为StringBuffer
StringBuffer bufB=new StringBuffer();
bufB.append("World.");
System.out.println(bufA);
System.out.println(bufB);
}
}
2.将StringBuffer变为String
所有类对象都支持变为String方法:public String toString()
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer bufA=new StringBuffer("HELLO");//String变为StringBuffer
String str=bufA.toString();//StringBuffer变为String
System.out.println(str);
}
}
在StringBuffer类里面还提供了一些String类所没有的方法
范例:执行数据插入
方法:public StringBuffer insert(int offset,数据类型 l)
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer buf=new StringBuffer("HELLO");//String变为StringBuffer
bufA.insert(0,"你好");
System.out.println(buf);
}
}
范例:删除部分数据
方法:public StringBuffer delete(int start,int end)
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer buf=new StringBuffer("HELLO WORLD");//String变为StringBuffer
bufA.delete(5,11);
System.out.println(buf);
}
}
范例:字符串反转
方法:public StringBuffer reverse()
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuffer buf=new StringBuffer("HELLO WORLD");//String变为StringBuffer
System.out.println(buf.reverse());
}
}
面试题:请解释String和StringBuffer的区别?
String和StringBuffer都是CharSequence接口的子类,其中String的内容不可以修改,而StringBuffer的内容可以修改。
StringBuffer类提供了与String类互补的操作方法,例如append(),insert(),delete()
使用最多是String类,只有在频繁修改的时候查使用StringBuffer类




在JDK1.5之后增加了一个StringBuilder类,此类定义如下

  public final class StringBuilder                                                          
extends Object
implements Serializable, CharSequence
但是通过方法组成可以发现,StringBuilder类和StringBuffer类的操作方法可以说是完成一样的
范例:使用StringBuilder类
public class StringBuffer {
public static void main(String[] args) throws Exception {
StringBuilder buf=new StringBuilder("HELLO WORLD");//String变为StringBuilder
System.out.println(buf.reverse());
}
}
范例:
public class Runtime {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stubT
testString();

testStringBuffer();

        testStringBuiler();

}
public static void testString(){
long start=System.currentTimeMillis();
String str=" ";
for(int x=0;x<30000;x++) {
str+=x;
}
long end=System.currentTimeMillis();
System.out.println("1.本操作花费的时间:"+(end-start));
}
public static void testStringBuffer(){
long start=System.currentTimeMillis();
StringBuffer str=new StringBuffer();
for(int x=0;x<30000;x++) {
str.append(str);
}
long end=System.currentTimeMillis();
System.out.println("2.Buffer本操作花费的时间:"+(end-start));
}
public static void testStringBuiler(){
long start=System.currentTimeMillis();
StringBuiler str=new StringBuiler();
for(int x=0;x<30000;x++) {
str.append(str);
}
long end=System.currentTimeMillis();
System.out.println("3.StringBuiler本操作花费的时间:"+(end-start));
}
}
可以发现:在频繁修改的情况下,String的性能是不足的,而StringBuffer和StringBuiler()明显是高效的,但是以上代码是单线程的情况下。
如果是在多线程共同操作,那么StringBuiler()会更快,因为和StringBuiler()采用是异步处理,而StringBuffer采用的是同步处理,但是StringBuffer数据更安全。
面试题,请解释,String,StringBuffer,StringBuiler的区别?
String不适合字符串的频繁修改,而StringBuiler和StringBuiler适合于频繁修改。而且速度高于String。
StringBuffe是在JDK1.0的时候引入的,而StringBuiler是在JDK1.5的时候引入的,而且StringBuffe和StringBuiler继承结构相同,方法的组成也相同。
StringBuffe中的所有都使用synchtonized进行标记,都是同步方法,而且性能较低,而StringBuiler采用异步处理,性能相对较高,但是StringBuffe
在多线程操作时的数据安全性要高于StringBuiler。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值