常见问题之Java——String、StringBuffer和StringBuilder哪个效率更高

常见问题之Java——String、StringBuffer和StringBuilder哪个效率更高

背景

日常我们开发时,我们会遇到各种各样的奇奇怪怪的问题(踩坑o(╯□╰)o),这个常见问题系列就是我日常遇到的一些问题的记录文章系列,这里整理汇总后分享给大家,让其还在深坑中的小伙伴有绳索能爬出来。
同时在这里也欢迎大家把自己遇到的问题留言或私信给我,我看看其能否给大家解决。

开发环境

  • 系统:windows10
  • JDK:openjdk11

内容

首先我们需要知道String在Java中是一个引用类型,其使用时是以对象的形式存在,而很多小伙伴可能不知道,String对象在进行重新赋值或值发生改变时都是生成一个新的对象,即栈中存储的String对象标记符(可理解为指针)指向的是一个堆中的内存地址,该地址下存储了该对象的值,这也是为什么String是引用类型的原因,而这时String对象的值进行改变时,并不是我们想的其会修改堆中的值,而是在堆中新开一个内存,将新的值存入其中,栈中存储的堆地址这时更换为新的值所在的堆内存地址,这样才算完成一次变更值。

假设String a = "test"+"001" 这时其在堆内存中的占用就是三个部分:
"test"、"001"、"test001"

而a对象的栈内存存储的是"test001"的堆内存地址,这时"test"和"001"只能等垃圾回收机制进行自动化回收才可以释放。

而StringBuffer和StringBuilder这两个的最大区别在于第一个是线程安全的,第二个是线程不安全的,同样的StringBuffer在确保线程安全的过程中,牺牲了一定的性能,因此StringBuilder速度是最快的。而两者与String相比其修改过程中是直接作用于指定的堆内存中,通常不会再进行开辟新的堆内存,因此相比String效率更高。因此我们可以得出如下结论:
String < StringBuffer < StringBuilder

这时可能有的小伙伴们会想我就想完成一个String a = "test"、"001" 还需要进行创建一个StringBuilder或StringBuffer 吗?

这就要进行考虑了,如果该逻辑所在的函数(方法)中调用频次特别特别低,这时开辟的内存有足够的自动回收时间,那用哪种其实效率并不明显。

如果该逻辑被调用的频次特别高,那我们就需要计算一下内存的消耗情况了,"test"、"001"、"test001"在String下时三个堆内存单位,StringBuffer声明一个对象一个堆内存单位,存储"test"、"001"依旧时一个,这里节省了2两个堆内存单位,而高频次下,String是StringBuffer这类方式的两倍,因此我们肯定是选择StringBuffer的,同时在节约了内存的情况下StringBuffer的性能要比String的性能要高,这里我们的效率也提升上来了。

本文声明:
88x31.png
知识共享许可协议
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

你可能感兴趣的:(知识分享之Java,常见问题,指针,java,python,编程语言,数据库)