java StringBuffer 和 StringBuilder的区别

352 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

前言

在上一篇文章中给大家讲了String 和 StringBuffer的区别,这次带来StringBulider和StringBuffer的区别。

src=http___image.bubuko.com_info_201801_20180101185340038877.png&refer=http___image.bubuko.png

fix:上一篇讲到的误区

在上次我讲到String在某些情况下比StringBuilder快,其实是不对的,以及StringBuilder内存修改有消耗。这些是不对的。正确应该是String慢的原因在于它不断地开辟空间,在java中开辟内存空间是比较消耗时间的,这个在多次拼接字符串的累积消耗时间可以测试出来,具体就请大家自行时实践了。我测试StringBuilder是0.008秒而String却花费0.64多秒。然后StringBuilder快的原因也就是它自始至终都是一个对象操作,不会产生多余的内存碎片,而String大量的拼接会产生大量的内存碎片,这会增大GC的几率,故不推荐使用String来拼接。

StringBuffer

StringBuffer其实比较尴尬,在业务逻辑中大家都用的很少,甚至都没用过。StringBuffer的开发其实是sun公司觉得String这个脑瘫拼接操作估计自己也看不下去了,就退出了StringBuffer来替代String的拼接问题,同时还给拼接字符串加了线程安全,这个线程安全比较鸡肋,导致他额外的开销变得臃肿。StringBuffer的出生比StringBuilder还要早,但是Buffer出来后,sun公司发现在开发中使用线程安全拼接字符串是非常少的,所以后面开发了StringBuilder这个非线程安全的一个字符串拼接,在去掉了多线程安全的约束后,StringBuilder的速度真的是快到让人看不懂,网传在java1.5版本之后java的编译器编译为字节码文件后,会把String的 + 号拼接优化成为StringBUilder来做。但是在for循环中的+号会被替换为多个new StringBuilder,所以注意养成好习惯不管什么情况下都是用StringBuilder来拼接字符串。

总结

  1. StringBuiler 大于 StringBuffer 大于 String 执行速度
  2. 上面忘记提出一个点就是,三个类都是final类