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

文章目录

    • 区别:
    • 1. 字符串拼接
    • 2. 构建动态查询语句
    • 3. 格式化输出
    • 4. 字符串反转
    • 5. 插入字符串
    • 6. 删除子串
    • 7. 字符串替换
    • 8. 构建复杂JSON或XML结构
    • 9. 处理用户输入的大量数据
    • 10. 动态生成HTML页面
    • 11. 处理字符串格式转换
    • 12. 实现字符串缓冲区
    • 13. 拼接大量字符串数组元素
    • 14. 计算字符串长度限制内的文本
    • 15. 动态生成SQL IN子句

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)
————————————————

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/289124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLVM(简介)

历史 LLVM(low level virtual machine)起源于伊利诺伊大学的一个编译器实验项目&#xff0c;目前已经发展成一个集编译器和工具链为一体的商业开源项目&#xff0c;因此其英文名称的含义被扩大&#xff0c;不再仅仅是字面意思。其创始人为 Chris Lattner。LLVM项目遵循的开源许…

java数据结构与算法刷题-----LeetCode746. 使用最小花费爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

嵌入式系统(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

上一篇文章我们介绍了嵌入式系统 嵌入式系统&#xff08;Embedded System&#xff09;是一种特定用途的计算机系统&#xff0c;它通常嵌入在更大的产品或系统中&#xff0c;用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成&#xff0c;旨在满足特定的需求&…

SQL窗口函数大小详解

窗口大小 OVER 子句中的 frame_clause 选项用于指定一个滑动的窗口。窗口总是位于分区范围之内&#xff0c;是分区的一个子集。指定了窗口之后&#xff0c;分析函数不再基于分区进行计算&#xff0c;而是基于窗口内的数据进行计算。 指定窗口大小的语法如下&#xff1a; ROWS…

了解并使用django-rest-framework-jwt

一 JWT认证 在用户注册或登录后&#xff0c;我们想记录用户的登录状态&#xff0c;或者为用户创建身份认证的凭证。我们不再使用Session认证机制&#xff0c;而使用Json Web Token&#xff08;本质就是token&#xff09;认证机制。 Json web token (JWT), 是为了在网络应用环…

2023年12月GESP C++七级编程题转Python真题解析

七、2023年12月GESP C(Python)七级编程题 2023年12月GESP Python最高六级&#xff0c;但C与Python同级编程题相同。本篇引用2023年12月GESPC七级编程题&#xff0c;用Python实现。 【七级编程题1】 【试题名称】&#xff1a;商品交易 时间限制&#xff1a;1.0 s 内存限制&…

CMake入门教程【核心篇】引用子模块.cmake文件(include)

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「本文的内容」&#xff1a;CMake入门教程 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 include子模块举个例…

四、HTML 属性

属性是 HTML 元素提供的附加信息。 一、HTML 属性 HTML 元素可以设置属性属性可以在元素中添加附加信息属性一般描述于开始标签属性总是以名称/值对的形式出现&#xff0c;比如&#xff1a;name"value"。 二、 属性实例 HTML 链接由 <a> 标签定义。链接的地…

HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目&#xff0c;都用到了蓝牙模块&#xff0c;如&#xff1a;手机和stm32的通信&#xff0c;电赛中的双车通信&#xff0c;还是遥感小车的…

教育机构培训系统小程序功能清单

制作一款适合自己的教育机构培训系统小程序&#xff0c;可以为学员提供更便捷的学习体验&#xff0c;同时提高机构的教学效率。今天将详细介绍如何使用乔拓云平台制作教育机构培训系统小程序。 在浏览器搜索乔拓云&#xff0c;登录到后台&#xff0c;选择教育系统并点击进入。在…

使用MQTT.JS创建一个网页版的MQTT客户端

一、MQTT.JS介绍 MQTT.js 是一个开源的 MQTT 协议的客户端库&#xff0c;使用 JavaScript 编写&#xff0c;主要用于 Node.js 和 浏览器环境中。是JavaScript 环境下的 MQTT 客户端库。可以用于微信小程序、支付宝小程序等定制浏览器环境。 我们可以直接在HTML文件中进行调用…

静态代理、JDK动态代理、CGLIB动态代理以及JDK和CGLIB动态代理的区别

代理 什么是代理&#xff1f;两个设计原则三要素 静态代理静态代理的实现定义接口-定义行为静态代理 -> 目标角色静态代理-> 代理角色静态代理测试 特点 JDK动态代理newProxyInstance获取代理对象通过代理对象实现目标对象的功能特点 Java动态代理类中的invoke是怎么调用…

P8 RV1126推流 —— 摄像头和咪头模块初始化

前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_C…

对偶问题的基本性质

写于&#xff1a;2024年1月3日晚 修改于&#xff1a; 原规划与对偶规划 原规划对偶规划 max ⁡ z C T X s.t. { A X ≤ b , 其中 X ( m ∗ 1 ) X ≥ 0 \begin{aligned} & \max \mathrm{z}\mathbf{C}^T \mathbf{X} \\ & \text { s.t. }\left\{\begin{array}{l}\mat…

RFID在物流、供应链管理、工业自动化等领域的广泛应用

随着物联网技术的不断发展&#xff0c;RFID&#xff08;无线射频识别&#xff09;技术作为一种自动识别和跟踪技术&#xff0c;在物流、供应链管理、工业自动化等领域得到了广泛应用。本文将介绍RFID解决方案及其应用场景。 一、RFID技术概述 RFID是一种通过无线电波通信&…

Apache的配置与应用

目录 1、Apache简介 2、Apache连接保持 3、Apache的访问控制 3.1、客户机地址限制 3.2、用户授权限制 &#xff08;1&#xff09;创建用户认证数据文件 &#xff08;2&#xff09;添加用户授权配置 &#xff08;3&#xff09;验证用户访问授权 4、Apache日志分割 4…

ALSA学习(5)——ASoC架构中的Machine

参考博客&#xff1a;https://blog.csdn.net/DroidPhone/article/details/7231605 &#xff08;以下内容皆为原博客转载&#xff09; 文章目录 一、注册Platform Device二、注册Platform Driver三、初始化入口soc_probe() 一、注册Platform Device ASoC把声卡注册为Platform …

FreeRTOS——计数型信号量知识总结及实战

1计数型信号量概念 1&#xff09;计数型信号量相当于队列长度大于1 的队列&#xff0c;因此计数型信号量能够容纳多个资源 2&#xff09;适用场景&#xff1a; 事件计数&#xff1a; 当每次事件发生后&#xff0c;在事件处理函数中释放计数型信号量&#xff08;计数值1&#x…

shell编程二

shell 脚本规范 shell脚本文件需要以.sh结尾 第一个原因&#xff0c;让别人认的这个是shell脚本&#xff0c;sh后缀编辑时有高亮显示。 拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本 ​ # 执行脚本方式 1、 sh 脚本.sh 2、 bash 脚本.sh 3、 ./脚本.sh # 需要执行权…

【C语言】数组

㊙️小明博客主页&#xff1a;➡️ 敲键盘的小明 ㊙️ ✅关注小明了解更多知识☝️ 文章目录 前言一、什么是数组&#xff1f;二、一维数组的创建和初始化2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用3.3 一维数组的存储 三、二维数组的创建和初始化3.1 二维数组…
最新文章