StringBuilder和StringBuffer最详细讲解

文章讨论了Java中String对象的不可变性,以及在需要频繁修改字符串内容时,使用StringBuilder和StringBuffer的性能优势。StringBuffer是线程安全的,适合多线程环境,StringBuilder则在单线程环境下效率更高。文章提供了示例代码,展示了如何使用这三个类进行字符串操作,并提到了它们的构造方法和常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String在定义后, String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。

String对象内容的改变实际上是通过内存地址“断开-连接”变化来完成的,而原字符串中的内容并没有任何的改变。String str = "Hello";和str = str + " World";实质上是开辟了三个内存空间,str只是由原来指向"hello"变为指向“hello world”而已,而其原来的指向内容,是没有改变的。 因此,在以后的开发中,若要经常修改字符串的内容,请尽量少用String,因为字符串的指向“断开-连接”会大大降低性能;对于要经常修改内容的情况,建议使用:StringBuilder、StringBuffer.

案例

public class test {
    public static void main(String[] args) {
        String s = "";
        for (int i = 0;i<10000;i++){
            s += "abc";
        }
        System.out.println(s);
    }
}
public class test {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0;i<10000;i++){
            stringBuilder.append("abc");
        }
        System.out.println(stringBuilder);
    }
}
public class test {
    public static void main(String[] args) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 10000; i++) {
            stringBuffer.append("abc");
        }
        System.out.println(stringBuffer);
    }
}

 StringBuilder和StringBuffer和String的执行速度:StringBuilder > StringBuffer > String

区别:

StringBuilder和StringBuffer的功能和方法是一样的,但是StringBuffer是线程安全,因为StringBuffer是用synchronized关键字修饰的。 

在单线程,程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低。

作用:

提高字符串的操作效率。

StringBuilder和StringBuffer的构造方法:

public StringBuilder();                               创建一个空白可变字符串对象,不含有任何内容。

public StringBuilder(String str);                 根据字符串的内容,来创建可变字符串对象。

public StringBuffer();                                 创建一个空白可变字符串对象,不含有任何内容。

public StringBuffer(String str);                   根据字符串的内容,来创建可变字符串对象。

StringBuilder和StringBuffer常用方法:

public StringBuilder append(任意类型);添加数据,并返回对象本身

public StringBuilder reverse();                反转容器中的内容

public StringBuilder length();                  返回长度(字符串出现的个数)

public String toString();                           通过toString()就可以实现把StringBuilder转换为String
 

public StringBuffer append(任意类型);添加数据,并返回对象本身

public StringBuffer reverse();                反转容器中的内容

public StringBuffer length();                  返回长度(字符串出现的个数)

public String toString();                         通过toString()就可以实现把StringBuffer转换为String

 添加

//添加数据
stringBuffer.append("java程序员,是个很好的工作");
System.out.println(stringBuffer);

//给指定的位置添加数据
stringBuffer.insert(11,"不");
System.out.println(stringBuffer);

 

//添加数据
stringBuilder.append("你好").append("不好").append("我是").append("付宇浩");
System.out.println(stringBuilder);

 我们可以看到,代码工作量很大,这里可以运用到链式编程

反转

//反转
stringBuilder.reverse();
System.out.println(stringBuilder);

//反转
stringBuilder.reverse();
System.out.println(stringBuilder);

 获取长度

//获取长度
System.out.println(stringBuilder.length());

 

//获取长度
System.out.println(stringBuffer.length());

删除

//删除片段数据
stringBuffer.delete(0,7);//删除的片段,包含头和尾
System.out.println(stringBuffer);

//删除指定数据
stringBuffer.deleteCharAt(4);
System.out.println(stringBuffer);
//删除片段数据
stringBuilder.delete(0,7);//删除的片段,包含头和尾
System.out.println(stringBuilder);

//删除指定数据
stringBuilder.deleteCharAt(4);
System.out.println(stringBuilder);

 修改

//修改元素数据,根据位置范围,添加字符串
stringBuffer.replace(2,4,"真假无所谓");
System.out.println(stringBuffer);

//修改指定位置的数据,根据位置,替换字符
stringBuffer.setCharAt(3,'s');
System.out.println(stringBuffer);
//修改元素数据,根据位置范围,添加字符串
stringBuilder.replace(2,4,"真假无所谓");
System.out.println(stringBuilder);

//修改指定位置的数据,根据位置,替换字符
stringBuilder.setCharAt(3,'s');
System.out.println(stringBuilder);

将StringBuilder和StringBuffer转换为String

//将stringBuilder转换成string
String str = stringBuilder.toString();
System.out.println(str);
//将stringbuffter转换成string
String str = stringBuffer.toString();
System.out.println(str);

 

<think>好的,用户让我详细介绍StringBuffer的构造方法操控Capacity的方法。首先,我需要回忆一下StringBuffer的基本知识。StringBufferJava中用于处理可变字符串的类,线程安全,适用于多线程环境。用户可能是在学习字符串处理,或者需要优化字符串操作的性能,特别是在频繁修改字符串内容的情况下。 首先,构造方法部分。常见的构造方法有几个?默认的无参构造应该创建一个初始容量为16的字符数组,这个我记得没错。然后是接收String参数的构造方法,初始容量应该是字符串长度加16,对吧?还有接收int参数的构造方法,可以自定义初始容量。可能还有接收CharSequence的构造方法,不过这个需要确认一下Java版本是否支持。 接下来是操控Capacity的方法。核心方法应该包括capacity()返回当前容量,length()返回实际字符数。然后是ensureCapacity(int minimumCapacity),这个方法用于确保容量至少达到指定的小值。如果当前容量不够,可能会扩容。还有trimToSize(),这个方法将容量调整为实际长度,释放多余的空间。另外,setLength(int newLength)这个方法可能也会影响容量,如果newLength超过当前容量,就需要扩容,同时可能用空字符填充多余的位置。 用户可能需要具体的例子来理解这些方法的使用场景。例如,默认构造方法初始容量16,当添加超过容量时,自动扩容的机制是怎样的?比如,每次扩容是旧容量的两倍加2吗?或者有其他规则?需要确认正确的扩容策略。 在介绍方法时,要说明每个方法的用途、参数、返回值,以及使用时需要注意的地方。比如ensureCapacity如果传入的值比当前的两倍加2还小,可能不会改变容量?或者会根据需求调整?需要准确描述。 另外,用户可能对线程安全有疑问,但题目中没有提到,可能不需要深入讨论,但可以简要提及StringBuffer是线程安全的,适用于多线程环境,与StringBuilder的区别。 可能需要检查是否有遗漏的方法,比如append或insert等方法是否会影响容量,但题目明确要求的是操控Capacity的方法,所以可能不需要涉及那些修改内容的方法,专注于直接影响容量的方法。 后,要组织好结构,先介绍构造方法,再逐个讲解操控Capacity的方法,每个部分给出代码示例,并解释输出结果,帮助用户理解。确保术语准确,例如容量(capacity)长度(length)的区别,避免混淆。 可能需要验证一些细节,比如trimToSize是否真的将容量设置为等于长度,或者是否有例外情况。例如,如果长度是0,容量会不会变成0?或者是否有小容量限制?根据Java文档,trimToSize会将容量调整为等于当前长度,但如果容量已经小于长度,可能不会改变?需要确认这些细节。 总结一下,回答的结构应该是: 1. 构造方法部分: - 无参构造 - String参数构造 - int参数构造 - CharSequence构造(如果有的话) 2. 操控Capacity的方法: - capacity() - ensureCapacity() - trimToSize() - setLength()的影响 每个方法给出示例解释,确保用户理解每个方法的用途效果。同时,提醒用户在使用时可能需要注意的点,比如合理设置初始容量以减少扩容次数,提高性能。</think>以下是关于`StringBuffer`构造方法容量控制方法的详细介绍: --- ### 一、构造方法 1. **无参构造方法** ```java StringBuffer() ``` - 创建一个初始容量为`16`的空缓冲区 - 示例: ```java StringBuffer sb = new StringBuffer(); System.out.println(sb.capacity()); // 输出16 ``` 2. **指定初始容量的构造方法** ```java StringBuffer(int capacity) ``` - 创建指定初始容量的空缓冲区 - 示例: ```java StringBuffer sb = new StringBuffer(30); System.out.println(sb.capacity()); // 输出30 ``` 3. **基于字符串的构造方法** ```java StringBuffer(String str) ``` - 创建缓冲区并初始化内容为`str` - 初始容量为`str.length() + 16` - 示例: ```java StringBuffer sb = new StringBuffer("Hello"); System.out.println(sb.capacity()); // 输出21(5+16) ``` 4. **基于CharSequence的构造方法** ```java StringBuffer(CharSequence seq) ``` - 创建包含`seq`字符序列的缓冲区 - 初始容量为`seq.length() + 16` --- ### 二、容量控制方法 1. **获取当前容量** ```java int capacity() ``` - 返回当前底层数组的容量 - 示例: ```java StringBuffer sb = new StringBuffer(); System.out.println(sb.capacity()); // 输出16 ``` 2. **确保小容量** ```java void ensureCapacity(int minimumCapacity) ``` - 确保容量至少为`minimumCapacity` - 扩容规则: - 如果`minimumCapacity > 当前容量`,则新容量取`max(当前容量*2 + 2, minimumCapacity)` - 示例: ```java StringBuffer sb = new StringBuffer(10); sb.ensureCapacity(20); System.out.println(sb.capacity()); // 输出22 (10*2+2) sb.ensureCapacity(30); System.out.println(sb.capacity()); // 输出30 ``` 3. **容量裁剪** ```java void trimToSize() ``` - 将底层数组容量调整为实际字符数量(即`length()`值) - 示例: ```java StringBuffer sb = new StringBuffer(100); sb.append("Hello"); sb.trimToSize(); System.out.println(sb.capacity()); // 输出5 ``` 4. **设置字符数量** ```java void setLength(int newLength) ``` - 设置缓冲区字符数量为`newLength` - 如果`newLength > 当前容量`,会自动扩容 - 如果`newLength < 当前长度`,会截断内容 - 示例: ```java StringBuffer sb = new StringBuffer("HelloWorld"); sb.setLength(5); System.out.println(sb); // 输出Hello ``` --- ### 三、关键特性 1. **自动扩容机制** - 当插入内容超出当前容量时,自动按`(旧容量*2) + 2`规则扩容 2. **容量 vs 长度** - `capacity()`:底层数组的总空间 - `length()`:实际存储的字符数量 3. **佳实践** - 预估数据量时使用指定容量构造方法,减少扩容次数提升性能 - 完成操作后调用`trimToSize()`释放多余内存 --- 通过合理使用这些方法,可以有效优化`StringBuffer`的内存使用效率操作性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值