StringBuffer类
1.StringBuffer类的主要特点
2.StringBuffer,StringBuilder,String区别
回顾String类特点:
String类对象有两种实例化方式:
1.直接赋值:只开辟一块堆内存空间,赋值符号右边直接自动入常量池
构造方法:开辟两块堆内存空间,赋值符号左边一块,右边一块,不会自动入池,使用intern()手工入池。
2.任何一个字符串都是String类的匿名对象
3.字符串一旦声明则不可改变,可以改变的只是String类对象的引用。
由于String类内容不可改变,为此在Java里面提供有另外一个类StringBuffer类(里面的内容可以修改)。
String类的对象可以使用"+"进行字符串的连接操作,而StringBuffer类必须使用append()方法。
方法:public StringBuffer append(数据类型 变量)
范例:观察StringBuffer的基本使用。
package TestDemo;
public class TestDemo{
public static void main(String[] args){
//String类可以直接赋值,但是Stringbuffer类不可以
StringBuffer stringBuffer=new StringBuffer();
stringBuffer.append("Hello").append("World!");
//String的引用传递 内容不可变final修饰,而StringBuffer呢
change(stringBuffer);//引用传递
System.out.println(stringBuffer);
}
public static void change(StringBuffer buffer){
buffer.append("\n").append("Hello SL!");
}
}
根据引用传递的不同,也能看出StringBuffer可变,String为final修饰的不可变。
image.png
清楚了StringBuffer的基本使用与基本操作之后,继续观察两个类的定义情况。
String类:
public final class String extends Object
implements Serializable, Comparable<String>, CharSequence
StringBuffer类:
public final class StringBuffer
extends Object
implements Serializable, CharSequence
发现这两个类都是CharSequence接口的子类。而在以后的开发之中,如果你看见某些方法的操作上出现的是CharSequence接口,那么应该清楚,只需要传递字符串即可。因为是接口子类的实现,所以可以传递。
package TestDemo;
public class TestDemo{
public static void main(String[] args){
CharSequence seq="Hello";//向上转型,String的匿名对象向上转型成Charsequence接口对象,所以赋值号右边可以是CharSequence或其接口子类
System.out.println(seq);
}
}
虽然String和StringBuffer类有着共同的接口,但是两个类对象之间无法直接转换。
String转化为StringBuffer
1.利用StringBuffer构造方法
public StringBuffer(String str)
2.利用append()方法
public StringBuffer append(CharSequence s)
public class TestDemo{
public static void main(String[] args){
StringBuffer seq=new StringBuffer("Hello");
seq.append("nihao");
System.out.println(seq);
}
}
StringBuffer类变为String
利用toString方法可以将StringBuffer,转化为String
public class TestDemo{
public static void main(String[] args){
StringBuffer seq=new StringBuffer("Hello");
String string=seq.toString();
System.out.println(string);
}
}
也可以利用String的构造方法:
public String(StringBuffer sb).
String和StringBuffer内容比较:
public boolean contentEquals(StringBuffer sb)
String类之中定义了许多的方法,方便于用户的开发,而在StringBuffer类也定义了一些方法,正好与String类互补。
1.字符串反转/转置 public StringBuffer reverse();
public class TestDemo{
public static void main(String[] args){
StringBuffer seq=new StringBuffer("Hello");
System.out.println(seq.reverse());
}
}
image.png
2.在指定索引位置增加数据:
public StringBuffer insert(int offset,数据类型 变量)
public class TestDemo{
public static void main(String[] args){
StringBuffer seq=new StringBuffer("Hello");
seq.insert(0, "nihao").insert(0, "dajia");
System.out.println(seq);
}
}
image.png
3.删除部分数据
public StringBuffer delete(int start,int end)
public class TestDemo{
public static void main(String[] args){
StringBuffer seq=new StringBuffer("Hello World SL");
seq.delete(5, 11);
System.out.println(seq);
}
}
image.png
从JDK1.5之后,增加了一个新的字符串操作类,StringBuilder类:
public final class StringBuilder
extends Object
implements Serializable, CharSequence
我们发现和StringBuffer类定义一样,方法也相同,文档中他们两者一样,但是翻看JDK源码,我们可以发现StringBuffer线程安全(synchronized修饰),StringBuilder线程不安全。
面试题:String,StringBuilder,StringBuffer的区别?
1.String的内容一旦声明不可改变(final修饰),StringBuilder,StringBuffer可以改变
2.StringBuffer提供的方法都是同步方法(synchronized),属于线程安全的操作,而StringBuilder类都属于异步方法,线程不安全。
日后在开发之中,95%使用String类,只有在需要频繁修改时候使用StringBuffer/StringBuilder。