Java——StringBuffer 和 StringBuilder

一、StringBuffer

1、简要介绍

StringBuffer 是 Java 中一个用于可变字符串操作的类。与 String 类不同,String 对象是不可变的,一旦创建就无法更改,而 StringBuffer 则允许对字符串内容进行修改,能够提高字符串操作的效率,尤其是在需要频繁修改字符串内容的场合。

StringBuffer 的所有的公共方法都是有 synchronized 关键字的,所以都是同步的,所以它在多线程中使用是线程安全的,但是由于这种对多线程情况的优化,导致它在单线程中使用性能较差。

2、字符数据的存储位置

StringBuffer 类继承自 AbstractStringBuilder 抽象类,这个抽象类中有一个字段是 value :

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    char[] value;

}

这个字符型数组中存储的就是 StringBuffer 对象的字符串数据,而且可以看到这个数组是可变的。

3、构造器

StringBuffer 有多个构造器:

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
    // 创建一个内容为空的字符缓冲区,初始容量设为 16 个字符
    public StringBuffer() {
        super(16);
    }

    // 创建一个内容为空的字符缓冲区,初始容量由参数指定
    public StringBuffer(int capacity) {
        super(capacity);
    }

    // 创建一个字符缓冲区,并用指定字符串的内容初始化,初始容量为字符串长度加 16
    public StringBuffer(String str) {
        super(str.length() + 16);
        append(str);
    }

    // 创建一个字符缓冲区,内容与给定的 CharSequence 相同,初始容量为 seq 的大小加 16
    public StringBuffer(CharSequence seq) {
        this(seq.length() + 16);
        append(seq);
    }
}

我们知道 StringBuffer 的父类是 AbstractStringBuilder。我们可以查看这个 super(16) 调用父类构造器的具体结构:

### Java StringBuffer StringBuilder API 文档及使用方法 #### StringBuffer 类概述 `StringBuffer` 是可变字符序列的一个实现,允许对字符串进行修改而不创建新的对象。此类提供了一个线程安全的可变字符序列[^2]。 #### StringBuilder 类概述 `StringBuilder` 同样提供了可变字符序列的功能,但是其所有公共实例方法都不是同步的,因此在单线程环境下性能优于 `StringBuffer`[^3]。 #### 构造函数 两者都支持多种构造方式: - 默认无参构造函数初始化一个空缓冲区。 - 带有一个初始容量参数的构造函数。 - 接受字符串作为参数来初始化缓冲区的内容。 ```java // 创建一个新的空 StringBuffer,默认容量为16个字符 StringBuffer sb1 = new StringBuffer(); // 使用指定容量创建一个新的空 StringBuffer StringBuffer sb2 = new StringBuffer(10); // 使用给定字符串内容创建一个新的 StringBuffer StringBuffer sb3 = new StringBuffer("Hello"); // 对应的 StringBuilder 构造函数也相同 StringBuilder builder1 = new StringBuilder(); StringBuilder builder2 = new StringBuilder(10); StringBuilder builder3 = new StringBuilder("Hello"); ``` #### 常见操作方法 ##### 追加数据 可以通过调用 `append()` 方法向现有字符序列追加新字符或子串。 ```java sb1.append("World"); // "HelloWorld" builder1.append("! "); // "! " ``` ##### 插入数据 利用 `insert()` 可以在特定位置插入字符或字符串片段。 ```java sb1.insert(5, ", "); // "Hello, World" builder1.insert(0, "Hi"); // "Hi! " ``` ##### 删除部分序列 通过 `delete()` 或者更精确范围控制下的 `deleteCharAt()`,可以从当前序列中移除某些元素。 ```java sb1.delete(5, 7); // 移除了", "后的结果:"HelloWorld" builder1.deleteCharAt(2); // 移除索引处的'i' :"H ! " ``` ##### 替换部分内容 替换功能由 `replace()` 提供,在指定范围内替换成其他文本。 ```java sb1.replace(0, 5, "Bye"); // 将"Hello"改为"Bye": "Bye, World" ``` ##### 获取设置长度 可以获取当前序列的实际长度(`length`)或是设定最大容量(`capacity`)。 ```java int currentLength = sb1.length(); // 当前长度 int capacitySize = sb1.capacity(); // 容量大小 ``` ##### 转化成不可变字符串 当完成所有的编辑之后,通常会希望得到最终版本的不可变表示形式——即转换回普通的 `String` 类型。 ```java String finalResult = sb1.toString(); // 得到最终的结果字符串 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值