【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,避免多次扩容的开销(扩容要抛弃原有数组,还要进行数组拷贝创建新的数组)。

相关推荐
weixin_307779131 小时前
PySpark实现ABC_manage_channel逻辑
开发语言·python·spark
lybugproducer2 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
??? Meggie2 小时前
【Python】保持Selenium稳定爬取的方法(防检测策略)
开发语言·python·selenium
南客先生2 小时前
马架构的Netty、MQTT、CoAP面试之旅
java·mqtt·面试·netty·coap
Minyy112 小时前
SpringBoot程序的创建以及特点,配置文件,LogBack记录日志,配置过滤器、拦截器、全局异常
xml·java·spring boot·后端·spring·mybatis·logback
百锦再2 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
武昌库里写JAVA3 小时前
39.剖析无处不在的数据结构
java·vue.js·spring boot·课程设计·宠物管理
酷爱码4 小时前
如何通过python连接hive,并对里面的表进行增删改查操作
开发语言·hive·python
画个大饼4 小时前
Go语言实战:快速搭建完整的用户认证系统
开发语言·后端·golang
喵先生!5 小时前
C++中的vector和list的区别与适用场景
开发语言·c++