当前位置: 首页 > news >正文

【面试干货】String、StringBuilder、StringBuffer 的区别

【面试干货】String、StringBuilder、StringBuffer 的区别

  • 1、String
  • 2、StringBuffer
  • 3、StringBuilder
  • 4、性能对比
  • 5、使用建议


💖The Begin💖点点关注,收藏不迷路💖

在Java中,String、StringBuilder和StringBuffer是用于处理字符串的常用类。虽然它们都表示字符串,但在使用方式和性能上存在一些重要的区别。

1、String

1、字符串常量: String类表示的是字符串常量,一旦创建后就不能被修改(不可变)

2、内存使用: 由于String的不可变性,每次对String进行修改(如拼接)操作,实际上都会创建一个新的String对象,这可能会导致大量的临时对象被创建,从而影响性能。

3、线程安全: 由于String的不可变性,它是 线程安全 的。

下面是一个简单的示例,展示了字符串拼接时会创建不同的对象:

package com.example;public class StringConcatenationExample {public static void main(String[] args) {String str1 = "Hello";String str2 = "World";// 使用 + 进行字符串拼接String result = str1 + str2;// 输出原始字符串和拼接后的字符串System.out.println("str1: " + str1); // HelloSystem.out.println("str2: " + str2); // WorldSystem.out.println("result: " + result); // HelloWorld// 比较内存地址System.out.println("str1 == result: " + (str1 == result)); // falseSystem.out.println("str2 == result: " + (str2 == result)); // false}
}

在这里插入图片描述
使用 StringBuilder 优化上面字符串拼接:

对于频繁的字符串拼接操作,建议使用 StringBuilder 或 StringBuffer 类,因为它们是可变的对象,支持高效地进行字符串拼接操作,不会创建大量临时对象。

以下是使用 StringBuilder 的示例:

public class StringBuilderExample {public static void main(String[] args) {String str1 = "Hello";String str2 = "World";// 使用 StringBuilder 进行字符串拼接StringBuilder sb = new StringBuilder();sb.append(str1);sb.append(str2);// 获取拼接后的字符串String result = sb.toString();// 输出原始字符串和拼接后的字符串System.out.println("str1: " + str1); // HelloSystem.out.println("str2: " + str2); // WorldSystem.out.println("result: " + result); // HelloWorld}
}

在这里插入图片描述
使用 StringBuilder 来进行字符串拼接,这避免了创建大量临时对象,提高了性能。

2、StringBuffer

1、字符串变量: StringBuffer类表示的是字符串变量,其对象的内容是可以修改的(可变)

2、内存使用: 使用StringBuffer进行字符串拼接时,不需要创建新的对象,而是在原有对象的基础上进行追加操作,从而提高了性能

3、线程安全: StringBuffer是线程安全的,它内部的每一个方法都使用了synchronized关键字进行同步,因此可以在多线程环境下安全地使用。

示例:

public class StringBuilderExample {public static void main(String[] args) {// 创建一个 StringBuilder 对象并初始化为 "Hello"StringBuilder sb = new StringBuilder("Hello");// 使用 append 方法在原有对象上追加内容sb.append(" World");// 获取拼接后的字符串String result = sb.toString();// 输出拼接后的字符串System.out.println(result); // Hello World}
}

3、StringBuilder

1、字符串变量: 与StringBuffer类似,StringBuilder也表示字符串变量,其内容也是可以修改的(可变)

2、内存使用: StringBuilder在内存使用上与StringBuffer相同,都是在原有对象上进行追加操作,从而提高了性能。

3、线程安全: 与StringBuffer不同,StringBuilder是线程非安全的。 因此,在多线程环境下使用StringBuilder可能会导致数据不一致或其他线程安全问题。但在单线程环境下,StringBuilder的性能通常优于StringBuffer。

示例:

public class StringBuilderExample {public static void main(String[] args) {// 创建一个 StringBuilder 对象并初始化为 "Hello"StringBuilder sb = new StringBuilder("Hello");// 使用 append 方法在原有对象上追加内容sb.append(" World");// 获取拼接后的字符串String result = sb.toString();// 输出拼接后的字符串System.out.println(result); // 输出: Hello World}
}

4、性能对比

1、StringBuilder的执行效率高于StringBuffer:由于StringBuffer是线程安全的,其内部方法使用了synchronized进行同步,这在一定程度上降低了其性能。而StringBuilder没有同步开销,因此在单线程环境下性能更高。

2、StringBuffer和StringBuilder的性能都高于String:由于String的不可变性,每次修改都会创建新的对象,而StringBuffer和StringBuilder都是在原有对象上进行修改,因此性能更高。

5、使用建议

1、对于大量字符串拼接操作建议使用StringBuffer或StringBuilder,以提高性能。

2、多线程环境下 如果需要在多线程环境下进行字符串拼接,建议使用StringBuffer;

3、在单线程环境下: 建议使用StringBuilder以提高性能

3、对于简单的字符串操作: 如果字符串操作不复杂,且不需要频繁修改字符串内容,可以直接使用String。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

相关文章:

  • 双指针【1】两数之和基础版 归并排序
  • 【LC刷题】DAY09:232 225 20 1047
  • 考研计组chap3存储系统
  • Python爬虫实现“自动重试”机制的方法(2)
  • uniapp 展示地图,并获取当前位置信息(精确位置)
  • 《web应用技术》第十一次作业
  • Postman接口测试工具详解
  • 【逻辑回归】和【线性回归】的区别和联系-九五小庞
  • 【git使用四】git分支理解与操作(详解)
  • 快手爬票概述
  • node设置镜像源详细教程
  • SpringMVC的工作流程
  • 编程App软件优化是什么
  • 【知识点】std::thread::detach std::lock_guard std::unique_lock
  • 【CT】LeetCode手撕—121. 买卖股票的最佳时机
  • CODING 缺陷管理功能正式开始公测
  • HTML-表单
  • React-Native - 收藏集 - 掘金
  • SpringBoot几种定时任务的实现方式
  • 闭包,sync使用细节
  • 电商搜索引擎的架构设计和性能优化
  • 思否第一天
  • 主流的CSS水平和垂直居中技术大全
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • (3)llvm ir转换过程
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (五)c52学习之旅-静态数码管
  • (一)基于IDEA的JAVA基础1
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET 材料检测系统崩溃分析
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @GlobalLock注解作用与原理解析
  • @hook扩展分析
  • @property python知乎_Python3基础之:property
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [Android]How to use FFmpeg to decode Android f...
  • [Angular] 笔记 21:@ViewChild
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [C/C++]数据结构 循环队列
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [CTSC2014]企鹅QQ
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [Firefly-Linux] RK3568 pca9555芯片驱动详解
  • [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信
  • [iOS]中字体样式设置 API
  • [KMP求最小循环节][HDU1358][Period]