Osheep

时光不回头,当下最重要。

Java基础类库之StringBuffer类

导语

很多新手都搞不懂String、StringBuffer、StringBuilder之间到底有什么区别,那就一点一点来说一下吧。

主要内容

  • StringBuffer类的主要特点
  • StringBuffer、StringBuilder、String的区别

具体内容

String类

String类的特点:

  • String类对象有两种实例化方式:
    • 直接赋值:只开辟一块堆内存空间,可以自动入池。
    • 构造方法:开辟两块堆内存空间,不会自动入池,使用intern()手工入池。
  • 任何一个字符串都是String类的匿名对象。
  • 字符串一旦声明则不可改变,可以改变的只是String类对象的引用。

虽然在所有的项目里面,String类都一定要使用,可是String类有一个问题不得不进行重复,那么就是String类的内容不可改变。为此在Java里面提供有另一个类——StringBuffer类(内容可修改)。

StringBuffer类

String类的对象可以使用“+”进行字符串的连接操作,但是在StringBuffer类里面必须使用append()方法进行追加:

  • public StringBuffer append(数据类型 变量)

范例:观察StringBuffer基本使用

public class TestDemo {
    public static void main(String args[]) {
        // String类可以直接赋值实例化,但是StringBuffer类不行
        StringBuffer buf = new StringBuffer();
        buf.append("Hello ").append("World ").append("!!!");
        change(buf);  // 引用传递
        System.out.println(buf);
    }
    public static void change(StringBuffer temp) {
        temp.append("\n").append("Hello MLDN .");
    }
}

输出结果

Hello World !!!
Hello MLDN .

发现StringBuffer类的内容是可以进行修改的,而String的内容是不可以修改的。

观察两个类的区别:

String类: StringBuffer类:
public final class String extends Object implements Serializable, Comparable<String>, CharSequence{} public final class StringBuffer extends Object implements Serializable, CharSequence{}

发现String与StringBuffer都是CharSequence接口的子类。而在以后的开发之中,如果看到某些方法出现的是CharSequence接口,那么应该清楚,只需要传递字符串即可。

CharSequence seq = "Hello";  // 向上转型
System.out.println(seq);  // String类覆写的toString()

虽然String和StringBuffer类有着共同的接口,但是这两个类对象之间如果要转换不能够直接转换。

  • 将String对象转换为StringBuffer对象:
    • 方法一:利用StringBuffer类的构造方法(public StringBuffer(String str))。
    • 方法二:利用append()方法(public StringBuffer append(String str))。
  • 将StringBuffer对象转换为String对象:
    • 利用toString()方法可以将StringBuffer转换为String。
    • 也可以利用String类的构造方法转换(public String(StringBuffer buffer)。

在String类里面也提供有与StringBuffer比较的方法:public boolean contentEquals(StringBuffer sb)。

StringBuffer buf = new StringBuffer("Hello");
System.out.println("hello".contentEquals(buf));
System.out.println("Hello".contentEquals(buf));

输出结果

false
true

String类之中定义了许多的方法便于用户的开发,而在StringBuffer类里面也定义了许多的操作方法,而且部分方法与String类是正好互补的。

  • 字符串反转:public StringBuffer reverse()。
  • 在指定的索引位置增加数据:public StringBuffer insert(int offset, 数据类型 变量)。
  • 删除部分数据:public StringBuffer delete(int start, int end)。
StringBuffer buf1 = new StringBuffer("Hello");
System.out.println(buf.reverse());
buf.insert(0, "MLDN ").insert(0, "你好 ");

StringBuffer buf2 = new StringBuffer("Hello");
System.out.println(buf);

StringBuffer buf3 = new StringBuffer("Hello World MLDN");
System.out.println(buf.delete(5, 11));

输出结果

olleH
你好 MLDN Hello
Hello MLDN

StringBuffer、StringBuilder、String的区别

从JDK1.5之后增加了一个新的字符串操作类:StringBuilder类,这个类的定义结构如下:

public final class StringBuffer extends Object 
implements Serializable, CharSequence{}

发现StringBuffer类与StringBuilder类在定义上非常的相似,几乎连方法也一样。

查看源代码,发现StringBuffer的方法前都有synchronized关键字。

面试题:String、StringBuffer、StringBuilder的区别?

  • String的内容一旦声明则不可改变,而StringBuffer与StringBuilder声明的内容可以改变。
  • StringBuffer类中提供的方法都是同步方法,属于安全的线程操作,而StringBuilder类中的方法都属于异步方法,属于非线程安全的操作。

在开发之中,如果见到了字符串的应用,一般使用String类,只有在需要字符串频繁修改的时候才会考虑使用到StringBuffer或者是StringBuilder类操作。

总结

String类依然是最常用的字符串描述类,而StringBuffer类由于出现时间较长,所以使用要比StringBuilder多。

更多内容戳下面:

点赞