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.hqwc.cn/news/318339.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

springboot整合webservice使用总结

因为做的项目中用到了webservice,所以在此总结一下。 一、webservice简介 Web Service也叫XML Web Service, WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求&#xff0c;轻量级的独立的通讯技术。是通过SOAP在Web上提供的软件服务&#xff0c;使…

mfc100u.dll文件丢失,有五种不同解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到mfc100u.dll文件”。那么&#xff0c;mfc100u.dll文件到底是什么&#xff1f;为什么会出现丢失的情况&#xff1f;本文将详细介绍mfc100u.dll文件的作用以及丢失的原因&#xff0c;并…

IDEA设置新建类注释、手动注释详解

文章目录 一、背景二、模板三、设置方法1、新建类注释设置2、手动注释设置 一、背景 每次在一台新电脑安装idea&#xff0c;都需要重新设置idea注释配置&#xff0c;说常用吧&#xff0c;也就新安装时才用&#xff0c;时间久步骤容易忘记&#xff0c;所以用此文章记录一下。 二…

【备忘】今天写一下如何买免费证书

使用场景 使用微信支付宝支付转账时小游戏小程序接口开发时其它情况 开发中不可避免的会接触https&#xff0c;有的公司有运维去做这个事&#xff0c;有的是老板自己会搞https证书&#xff0c;咱多了解一项技术也是好事。 如何买证书 登录阿里云控制台&#xff0c;搜索ssl证…

el-pagination 当代码中修改pageIndex时,页面始终展示第一页的数据

问题描述 查询表格&#xff0c;初始化时&#xff0c;pageIndex默认为1&#xff0c;后面因为查询条件数据缓存&#xff0c;pageIndex设置为了4&#xff0c;但是pagenation组件使用都是展示1&#xff0c;页面的数据确实是第4页的数据&#xff1b; 问题分析 组件外部的数据没有…

SAP ABAP ZPL打印

前言 本文用于简单介绍在SAP中使用ZPL语言进行打印的开发步骤&#xff0c;由于对ZPL语言并不是很熟悉&#xff0c;所以ZPL相关的部分并不会很深入&#xff0c;主要介绍在SAP端如何动态填充ZPL内容及预览、打印。 什么是ZPL ZPL是斑马条码打印机工业型号用的编程语言。利用这些…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型&#xff08;LVLMs&#xff09;&#xff0c;例如CLIP&#xff0c;使用一个共同的视觉词汇&#xff0c;以适应多样的视觉任务。然而&#xff0c;在处理一些需要更精细和密集视觉感知的特殊任务时&#xff0c;例如文档级OCR或图表理解&#xff0c;尤其…

【信号处理:小波包转换(WPT)/小波包分解(WPD) 】

【信号处理&#xff1a;小波包转换&#xff08;WPT&#xff09;/小波包分解&#xff08;WPD&#xff09; 】 小波包变换简介WPT/WPD的基础知识WPT/WPD的主要特点The Wavelet Packet Transform 小波包变换前向小波数据包变换最佳基础和成本函数数学中波纹的最佳基础其他成本函数…

在Cadence中单独添加或删除器件与修改网络的方法

首先需要在设置中使能 ,添加或修改逻辑选项。 添加或删除器件&#xff0c;点击logic-part&#xff0c;选择需要添加或删除的器件&#xff0c;这里的器件必须是PCB中已经有的器件&#xff0c;Refdes中输入添加或删除的器件标号&#xff0c;点击Add添加。 添加完成后就会显示在R1…

Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

案例089:基于微信小程序的校园综合服务平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…