StringBuffer类

2019-01-26  本文已影响0人  秋笙fine

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。

上一篇下一篇

猜你喜欢

热点阅读