java StringBuilder对比String的优点和15个经典案例

2024-01-08 17:56:18


Java中的 StringBuilder类和 String类在处理字符串时有显著的区别,主要体现在可变性、性能以及线程安全性等方面:

区别:

  1. 可变性:

    • String:是不可变的。每次对String对象进行拼接、替换等操作时,都会创建一个新的String对象,原始对象保持不变。
    • StringBuilder:是可变的。它提供了append()、insert()、delete()等方法,可以直接修改对象内部的字符数组,不需要每次都创建新的对象。
  2. 性能:

    • String:由于其不可变性,在大量字符串操作(尤其是连接)时,会产生较多临时对象,消耗内存且影响性能。
    • StringBuilder:对于频繁的字符串修改操作,性能更优,因为它重用已分配的内存空间,减少垃圾回收压力。
  3. 线程安全:

    • String:本身的操作不是线程安全的,但由于不可变性,一旦创建后,多个线程读取不会产生问题。
    • StringBuilder:在单线程环境下效率更高,因为没有同步开销;而在多线程环境下,如果需要并发修改,应该使用StringBuffer,它是线程安全版本的StringBuilder

使用StringBuilder的优点案例:

以下是一些使用StringBuilder的优势场景及其示例代码:

1. 字符串拼接

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append("Value: ").append(i).append("\n");
}
String result = sb.toString(); // 最终结果是一个包含大量拼接内容的字符串

在循环中多次拼接字符串时,使用StringBuilder可以避免大量的中间String对象生成。

2. 构建动态查询语句

StringBuilder sql = new StringBuilder("SELECT * FROM Users WHERE ");
if (!name.isEmpty()) {
    sql.append("Name='").append(name).append("' AND ");
}
if (!age <= 0) {
    sql.append("Age=").append(age);
}
String query = sql.toString().trim();

根据条件动态构造SQL查询语句时,使用StringBuilder可以灵活添加或删除条件。

3. 格式化输出

StringBuilder logMessage = new StringBuilder();
logMessage.append("Timestamp: ")
          .append(new Date())
          .append(", Event: ")
          .append(eventDescription)
          .append(", Details: ")
          .append(details);
System.out.println(logMessage.toString());

构建日志消息时,通过StringBuilder逐个添加各个部分,然后一次性打印。

4. 字符串反转

StringBuilder strBuilder = new StringBuilder("Hello World");
strBuilder.reverse();
String reversedStr = strBuilder.toString(); // "dlroW olleH"

使用StringBuilder的reverse()方法可以高效地实现字符串反转。

5. 插入字符串

StringBuilder sb = new StringBuilder("This is a test.");
int index = 7;
sb.insert(index, "long "); // 插入"long "
String modifiedStr = sb.toString(); // "This is long a test."

可以在指定位置插入字符串,无需创建新对象。

6. 删除子串

StringBuilder sb = new StringBuilder("Hello, this is a test.");
sb.delete(7, 14); // 删除从索引7到13的子串
String trimmedStr = sb.toString(); // "Hello, test."

当然,以下是更多的StringBuilder使用优点案例:

7. 字符串替换

StringBuilder sb = new StringBuilder("Hello, world!");
sb.replace(7, 12, "Java"); // 将"world"替换为"Java"
String replacedStr = sb.toString(); // "Hello, Java!"

使用replace()方法可以高效地在原字符串基础上进行替换操作。

8. 构建复杂JSON或XML结构

StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.append("{");
jsonBuilder.append("\"name\": \"John\", ");
jsonBuilder.append("\"age\": ").append(30).append(", ");
jsonBuilder.append("\"city\": \"New York\"");
jsonBuilder.append("}");
String jsonString = jsonBuilder.toString(); // "{"name": "John", "age": 30, "city": "New York"}"

在构造复杂的JSON或XML文本时,利用StringBuilder逐个添加属性和值,避免频繁创建新对象。

9. 处理用户输入的大量数据

Scanner scanner = new Scanner(System.in);
StringBuilder inputBuffer = new StringBuilder();

while (scanner.hasNextLine()) {
    inputBuffer.append(scanner.nextLine()).append("\n");
}
String userInput = inputBuffer.toString().trim();

当需要收集用户输入的大量文本时,使用StringBuilder能有效减少内存消耗和提高处理速度。

10. 动态生成HTML页面

```java
StringBuilder htmlBuilder = new StringBuilder("<html><body>");
for (String item : itemList) {
    htmlBuilder.append("<div>").append(item).append("</div>");
}
htmlBuilder.append("</body></html>");
String htmlPage = htmlBuilder.toString();
```
在动态生成HTML或其他标记语言时,通过`StringBuilder`逐行添加元素内容,形成完整的页面。

继续列举StringBuilder在实际场景中的优点案例:

11. 处理字符串格式转换

```java
StringBuilder hexBuilder = new StringBuilder();
for (byte b : byteArray) {
    hexBuilder.append(String.format("%02X ", b));
}
String hexString = hexBuilder.toString().trim(); // 用于将字节数组转换为十六进制字符串
```
当需要将数值或其他类型的数据转换成特定格式的字符串时,利用`StringBuilder`可以高效地完成这一过程。

12. 实现字符串缓冲区

```java
StringBuilder buffer = new StringBuilder();

public void addMessage(String message) {
    buffer.append(message).append("\n");
}

public String getBufferContent() {
    return buffer.toString();
}
```
在某些需要维护一个可变字符串缓冲区的场景中(例如记录日志或消息队列),`StringBuilder`可以作为一个高效的字符串存储容器。

13. 拼接大量字符串数组元素

```java
String[] words = {"Hello", "World", "Java"};
StringBuilder sentence = new StringBuilder();
for (String word : words) {
    sentence.append(word).append(" ");
}
sentence.deleteCharAt(sentence.length() - 1); // 删除末尾多余的空格
String result = sentence.toString(); // "Hello World Java"
```
当需要将多个字符串数组元素连接成一个连续的句子时,使用`StringBuilder`避免了多次创建和复制字符串对象。

14. 计算字符串长度限制内的文本

```java
int maxLength = 100;
StringBuilder textBuilder = new StringBuilder();
while (/* reading text from a file or stream */) {
    String line = readLine();
    if (textBuilder.length() + line.length() <= maxLength) {
        textBuilder.append(line);
    } else {
        break; // 已达到最大长度限制
    }
}
String limitedText = textBuilder.toString();
```
在需要限制输出文本长度的场景中,通过实时计算`StringBuilder`长度来决定是否添加更多内容。

15. 动态生成SQL IN子句

```java
List<Integer> ids = Arrays.asList(1, 2, 3, 4, 5);
StringBuilder inClause = new StringBuilder("(");
for (int i = 0; i < ids.size(); i++) {
    inClause.append(ids.get(i));
    if (i != ids.size() - 1) {
        inClause.append(", ");
    }
}
inClause.append(")");
String sql = "SELECT * FROM Users WHERE id IN " + inClause.toString();
```
在构造包含多个值的SQL IN子句时,`StringBuilder`能灵活、高效地添加各项值。

以上这些例子进一步展示了StringBuilder类在各种不同场景下的应用优势。总之,在涉及频繁修改、拼接字符串的操作中,选择StringBuilder能够显著提高程序性能并降低内存消耗。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

?最后我们放松一下眼睛
在这里插入图片描述

文章来源:https://blog.csdn.net/qqrrjj2011/article/details/135373227
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。