Java基础---String、StringBuilder和StringBuffer的区别

news/2024/10/21 15:34:06/

目录

典型回答

String的"+"是如何实现的

StringBuffer和StringBuilder

不要在for循环中使用+拼接字符串


  • 典型回答

  • 本质上都是char[]字符数组的实现
  • 在Java9之后,String类的实现改用byte数组存储字符串
  • 使用final关键字修饰字符数组来保存字符串,String是不可变的
  • 没有使用final关键字修饰,StringBuilder和StringBuffer是可变的
  • String中的对象是不可变的,也就可以理解为常量,线程安全
  • StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,是线程安全的
  • StringBuilder并没有对方法进行加同步锁,是非线程安全的
  • 每次要对String类型进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象
  • StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用
  • 相同情况下使用StringBuilder相比使用StringBuffer仅能获得10%-15%左右的性能提升,但却要冒多线程不安全的风险
  • 使用场景:
    • 操作少量的数据用String,但是常改动内容且操作数据多情况下最好不要用String,因为每次生成中间对象性能会降低
    • 单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响
    • 多线程下操作大量字符串,且需要保证线程安全,则用StringBuffer
  • String的"+"是如何实现的

  • 使用+拼接字符串,其实只是Java提供的一个语法糖,那么就来解一解这个语法糖,看看他的内部原理到底是如何实现的
  • 还是这样一段代码
  • 把他生成的字节码进行反编译,看看结果

  • 反编译后的内容如下,反编译工具为jad

  • 通过查看反编译以后的代码,可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的
  • 那么也就是说,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append
  • StringBuffer和StringBuilder

  • 与 String 不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下:

  • 其append源码如下:

  • 该类继承了`AbstractStringBuilder`类,看下其`append`方法:

  • append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,会进行扩展
  • 不要在for循环中使用+拼接字符串

  • 前面分析过,其实使用`+`拼接字符串的实现原理也是使用的`StringBuilder`,那为什么不建议在for循环中使用呢?

  • 反编译后代码如下:

  • 可以看到,反编译后的代码,在 for 循环中,每次都是 new 了一个 StringBuilder ,然后再把 String 转成 StringBuilder ,再进行 append
  • 而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费
  • 所以,阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展;而不要使用 +

http://www.ppmy.cn/news/705960.html

相关文章

苹果计算机怎么显示桌面,苹果mac电脑快速显示桌面及切换应用的详细教程

使用mac电脑时,我们习惯打开很多应用,文档等等。如果打开应用非常多,需要操作桌面,却不知如何快速返回桌面和切换应用时,操作就非常不便了,下面简单介绍mac电脑系统如何快速显示桌面及切换应用?…

苹果cms图片采集到网站服务器上,苹果cms采集的图片不显示解决办法

这篇文章主要为大家详细介绍了苹果cms采集的图片不显示解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。 一般图片不显示就两种原因 1、图片地址无效 什么情况下是图片地址无效呢? 比如&#x…

JSP网上订餐管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 网上订餐管理系统是一套完善的web设计系统,对理解JSP java SERLVET mvc编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发,数据库为Mysql5.0&a…

手机忘记密码的解决方法

忘记手机锁屏密码该怎么解决呢? IOS系统 如果该Apple ID仅为本手机独自使用,如果在忘记锁屏密码前已经开启了“iphone”功能,则可以使用查找iphone进行更改锁屏密码。这样就不会导致数据丢失! 如果Apple ID为多台手机共用或者未…

手机卡开机界面,无法进入rec,但可以进入fastboot,解决方案

想直接看解决方法见总结即可 2020.10.13:记一件小事。今晚官改miui日常升级呢,电脑上玩着玩着,手机还没开机继续打一会csgo人机,打完还没开机,一看一直卡在redmi界面,不对劲!一般开机redmi界面完…

flyme android 7 推送,魅族Flyme 7体验版推送更新:老旗舰也能升级

今日,魅族正式推送了Flyme 7体验版更新,版本号为Flyme 7.8.12.11 beta,这次的系统更新所涵盖的机型不仅包括今年的旗舰魅族16th和16th Plus,就连魅蓝Note 6和魅族Pro 7也可以尝尝鲜。 本次更新为魅族16th调整面部识别逻辑&#xf…

魅族android n 下载,魅蓝note3-Android7.0(N)-6.7.8.19-daily-内测-完整包-官网链接

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 "fileSize": "1.29 GB", "size": 1390011732, "title": "风险说明", "mandatoryTitle": "Android N 8月19日内测更新", "content": "Flym…

flyme禁止系统更新_魅族Flyme更新8.1.2.3A:重要系统更新!

手机中的操作系统有哪些呢?像我们熟悉的MIUI, EMUI, Flyme,氢os等等。而其中小米MIUI与魅族Flyme经常用来比较,哪一个才是最好用的操作系统,谁的UI设计更加的好看!那么近日,魅族 Flyme迎来了它的更新!让我们一起看看重大系统更新…