StringBuilder使用tips

本文探讨了StringBuilder相对于StringBuffer的性能优势,指出StringBuilder在RocketMQ源码中的巧妙使用。通过实例展示了如何预估容量以避免不必要的数组拷贝操作,从而提高效率。同时,讲解了StringBuilder的初始容量及扩容机制。

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

StringBuffer太粗糙了,或者说锁的粒度太大了,只是简单粗暴的加在方法上,所以很少人使用。

StringBuilder使用tips

  • new StringBuilder的时候,如果拼接的字符串比较简单,可以直接new一个带初始化容量大小的StringBuilder,比如RocketMQ源码会有类似写法
private String buildKey(final String topic, final int queueId) {
    StringBuilder sb = new StringBuilder(topic.length() + 5);
    sb.append(topic);
    sb.append(TOPIC_QUEUEID_SEPARATOR);
    sb.append(queueId);
    return sb.toString();
}
  • StringBuilder也有初始容量大小,是16,append的时候会判断容量够不够,不够的话,会进行数组拷贝Arrays.copyOf的操作


    RocketMQ commit代码示例:
    在这里插入图片描述
### C# 中 StringBuilder使用方法 在 C# 中,`StringBuilder` 是一个非常高效的类,用于处理字符串的频繁修改操作。与普通的字符串不同,`StringBuilder` 提供了动态调整字符串内容的能力,而不会像普通字符串那样每次修改都创建新的对象[^3]。 以下是 `StringBuilder` 的基本使用方法和一些关键功能: #### 1. 创建 `StringBuilder` 对象 可以通过构造函数创建一个 `StringBuilder` 对象。如果需要初始化字符串内容,可以直接传入初始值。 ```csharp using System.Text; // 创建空的 StringBuilder 对象 StringBuilder sb = new StringBuilder(); // 使用初始字符串创建 StringBuilder 对象 StringBuilder sbWithInitialString = new StringBuilder("Hello"); ``` #### 2. 添加字符串 使用 `Append` 方法可以将字符串追加到 `StringBuilder` 的末尾。 ```csharp sb.Append("First String"); sb.Append("Second String"); sb.Append("Third String"); Console.WriteLine(sb.ToString()); // 输出 "First StringSecond StringThird String" ``` 上述代码展示了如何通过连续调用 `Append` 方法来构建字符串[^1]。 #### 3. 插入字符串 使用 `Insert` 方法可以在指定位置插入字符串。 ```csharp sb.Insert(0, "Start: "); // 在索引 0 处插入字符串 Console.WriteLine(sb.ToString()); // 输出 "Start: First StringSecond StringThird String" ``` #### 4. 替换字符串 使用 `Replace` 方法可以替换指定范围内的字符。 ```csharp sb.Replace("First", "New"); Console.WriteLine(sb.ToString()); // 输出 "Start: New StringSecond StringThird String" ``` #### 5. 删除字符串 使用 `Remove` 方法可以从指定位置删除一定数量的字符。 ```csharp sb.Remove(0, 7); // 从索引 0 开始删除 7 个字符 Console.WriteLine(sb.ToString()); // 输出 "New StringSecond StringThird String" ``` #### 6. 获取长度 可以通过 `Length` 属性获取当前 `StringBuilder` 中存储的字符数。 ```csharp Console.WriteLine($"The current length is: {sb.Length}"); // 输出当前长度[^2] ``` #### 7. 转换为字符串 使用 `ToString` 方法可以将 `StringBuilder` 的内容转换为普通字符串。 ```csharp string result = sb.ToString(); Console.WriteLine(result); // 输出最终结果 ``` #### 8. 清空内容 使用 `Clear` 方法可以清空 `StringBuilder` 的所有内容。 ```csharp sb.Clear(); Console.WriteLine(sb.Length); // 输出 0 ``` --- ### 示例代码 以下是一个完整的示例,展示了 `StringBuilder` 的多种用法: ```csharp using System; using System.Text; class Program { static void Main() { StringBuilder sb = new StringBuilder("Hello"); sb.Append(" World!"); // 追加字符串 sb.Insert(6, ", C#"); // 插入字符串 sb.Replace("World", "Programmer"); // 替换字符串 sb.Remove(0, 6); // 删除部分字符串 Console.WriteLine(sb.ToString()); // 输出最终结果 Console.WriteLine($"Length: {sb.Length}"); // 输出长度 } } ``` --- ### 性能考虑 当需要对字符串进行大量添加或修改操作时,`StringBuilder` 比直接拼接字符串更高效。这是因为普通字符串是不可变的,每次修改都会创建新的字符串对象,而 `StringBuilder` 则会动态调整内部缓冲区以避免频繁分配内存[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值