Java学习笔记4——StringBuffer和StringBuilder

一、StringBuffer
StringBuffer是final修饰的类,但它存放的内容是可以改变的。
StringBuffer是线程安全的。

public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{
...
}

1、构造方法:
(1)默认的无参构造方法:public StringBuffer()
创建一个StringBuffer对象,默认大小为16。

StringBuffer sb = new StringBuffer();
//构造方法
public StringBuffer() {
    super(16);
}

(2)以容量大小(整型)为参数的构造方法:public StringBuffer(int capacity)
创建指定大小的StringBuffer对象。

StringBuffer sb = new StringBuffer(100);
public StringBuffer(int capacity) {
    super(capacity);
}

(3)以字符串为参数的构造方法:public StringBuffer(String str)
创建一个存在指定字符串的StringBuffer对象。

StringBuffer sb = new StringBuffer("Hello world!");
public StringBuffer(String str) {
    super(str.length() + 16);
    append(str);
}

(4)以CharSequence为参数的构造函数:public StringBuffer(CharSequence seq)
创建一个存在指定字符序列的StringBuffer对象。

CharSequence c = "Hello world!";
StringBuffer sb = new StringBuffer(c);

此方法是调用了(2)的构造方法。

public StringBuffer(CharSequence seq) {
    this(seq.length() + 16);
    append(seq);
}

简单说一下,CharSequence与String都能用于定义字符串,但CharSequence的值是可读可写序列,而String的值是只读序列。

//父类的构造方法
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}

因为StringBuffer继承了AbstractStringBuffer,其构造方法均是直接或间接调用父类的构造方法。


2、成员方法
A、StringBuffer支持的方法
(1)将指定的字符串追加到此字符序列:public synchronized StringBuffer append(String str)
(2)将此字符序列用其反转形式取代:public StringBuffer reverse()
(3)移除此序列的子字符串中的字符:public delete(int start, int end)
(4)将 int 参数的字符串表示形式插入此序列中:public insert(int offset, int i)
(5)使用给定 String 中的字符替换此序列的子字符串中的字符replace(int start, int end, String str)

例子:

public class StringDemo {  
    public static void main(String[] args) {  
        String s1 = "world";
        StringBuffer sb = new StringBuffer();

        sb.append("Hello");
        sb.append(s1);
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.reverse();
        System.out.println(sb.toString());
        System.out.println("-------------------");

    sb.insert(5," ");
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.delete(1, 3);
        System.out.println(sb.toString());
        System.out.println("-------------------");

        sb.replace(1, 3, "666");
        System.out.println(sb.toString());
        System.out.println("-------------------");

    }  
}

B、与String类似的方法
(1)获取StringBuffer字符的长度:public synchronized int length()
(2)获取当前容量:public synchronized int capacity()
(3)确保容量至少等于指定的最小值:public synchronized void ensureCapacity(int minimumCapacity)
(4)调整当前容量大小:public synchronized void setLength(int newLength)
(5)获取此序列中指定位置处的 char 值:public synchronized char charAt(int index)
包括了String类的很多方法,在StringBuffer中也可以使用。此处不再举例表述。

因为StringBuffer中的方法几乎都是被synchronized修饰,所以StringBuffer可以保证线程安全。

二、StringBuilder
StringBuilder 类是在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。其他成员方法等等都是类似的。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder类。然而在应用程序要求线程安全的情况下,则必须使用StringBuffer类。

三、String、StringBuffer、StringBuilder的区别
String属于字符串常量,StringBuffer和StringBuilder属于字符串变量。
String在修改时,是重新创建了一个String对象,然后再把引用指向新的对象。
而StringBuffer和StringBuilder都是在原对象上进行字符串拼接操作。一般情况下推荐使用StringBuilder。
从执行速度方面来说,StringBuilder>StringBuffer>String
在大部分情况下 StringBuilder > StringBuffer> String,当涉及多线程的情况时,则选用StringBuffer。

StringBuilder速度快,但是线程不安全。
StringBuffer速度慢,但是线程安全。


回顾了一下StringBuffer和StringBuilder,大致对这两个类有了一定的了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值