【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点

他们都是Java中处理字符串的类,区别主要体现在可变性线程安全性能上

1)String

  • **不可变:**String是不可变类,字符串对象创建,存储在堆中,字符串内容存储在字符串常量池中,一旦创建内容无法更改。每次对String进行修改操作(如拼接、截取等),都会创建新的字符串常量池对象
  • **适合场景:**String适合于字符串内容不会频繁变化的场景

2)StringBuffer

  • **可变:**StringBuffer是可变的,因为底层是字符数组,(字符是局部变量存栈上,跟着方法一起的生命周期,如果是成员变量存在堆中,跟着对象)任何操作都是对数组操作,而不是创建新的对象,可以进行字符串的追加、删除、插入等操作
  • **线程安全:**StringBuffer是线程安全的,内部使用了synchronized关键字保证多线程环境下的安全性
  • **适合场景:**适用于多线程环境中需要频繁修改字符串的场景

3)StringBuilder

  • **可变:**也是可变的,提供了与StringBuffer类似的操作方法
  • **非线程安全:**线程不安全
  • **性能:**由于少了同步的操作,性能开销比StringBuffer小
  • 适合场景:适用于单线程环境中需要大量修改字符串的场景

可以看我的另一篇博客:【Java】StringBuilder类和StringBuffer类的简单教程-CSDN博客

扩展知识

Java8中的优化

在Java8以后,编辑器会对字符串的常量拼接做优化,将字符串拼接转换为StringBuilder操作。种优化提高了代码性能,但是在动态拼接或多线程场景下,手动使用StringBuilder 和 StringBuffer 仍然更合适。

从演进角度看待三者

String 是Java 中基础且重要的类,并且String 也是Immutable 类的典型实现,被声明为finalclass,除了hash

这个属性其它属性都声明为final。

因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所景响。

StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和insert方法,可以将字符串添加到已有序列的末尾或指定位置。

它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。

在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder 登场了,StringBuilder 是JDK1.5 发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

StringBuffer 和 StringBuilder 二者都继承了 Abst ractStringBuilder,底层都是利用可修改的 char 数组(JDK 9以后是byte 数组)。

所以如果我们有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销(扩容要抛弃原有数组,还要进行数组拷贝创建新的数组)。

相关推荐
南境十里·墨染春水8 分钟前
C++ 笔记 友元(面向对象)
开发语言·c++·笔记
TT_441910 分钟前
python程序实现图片截图溯源功能
开发语言·python
笨笨饿24 分钟前
20_Git 仓库使用手册 - 初学者指南
c语言·开发语言·嵌入式硬件·mcu·学习
人间打气筒(Ada)28 分钟前
go实战案例:如何通过 Service Meh 实现熔断和限流
java·开发语言·golang·web·istio·service mesh·熔断限流
桦01 小时前
[C++复习]:STL
开发语言·c++
主宰者1 小时前
C# CommunityToolkit.Mvvm全局事件
java·前端·c#
计算机学姐2 小时前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat
前端小咸鱼一条2 小时前
16.迭代器 和 生成器
开发语言·前端·javascript
My的梦想已实现2 小时前
关于JAVA Springboot集成支付后打包JAR之后报安全错误的处理
java·spring boot·jar
小陈工2 小时前
2026年3月31日技术资讯洞察:AI智能体安全、异步编程突破与Python运行时演进
开发语言·jvm·数据库·人工智能·python·安全·oracle