字符串操作是编码中经常进行的操作。在实现字符串操作时,经常使用到String、StringBuilder、StringBuffer、StringConcatFactory。本文简单介绍下这四个类的区别及关联,方便选用。

String

String 对象是不可变的对象, 因此每次对 String 改变,其实都等同于生成一个新的 String 对象,然后将指针指向新的 String 对象。所以对经常更变内容的字符串最好不要用 String 表示。
为简化字符串拼接,Java重写+操作符,使其支持字符串拼接。在String + 拼接的底层,是StringBuilder实现的,整个过程是StringBuilder append之后toString。(Java9 改成了invokedynamic,StringConcatFactory.makeConcatWithConstants)

StringBuffer

StringBuffer是线程安全的,append等方法用synchronized修饰,1.0提供的接口。
使用 StringBuffer,每次字符串操作都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,然后改变对象引用。当字符串对象经常改变时,推荐使用StringBuffer。

StringBuilder

java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

StringConcatFactory

Java 9 利用invokeDynamic调用StringConcatFactory.makeConcatWithConstants方法进行字符串拼接优化,相比于Java 8通过转换为StringBuilder来进行优化,Java 9 提供了多种STRATEGY可供选择,这些STRATEGY有BC_SB(等价于Java 8的优化方式)、BC_SB_SIZED、BC_SB_SIZED_EXACT、MH_SB_SIZED、MH_SB_SIZED_EXACT、MH_INLINE_SIZED_EXACT,默认是MH_INLINE_SIZED_EXACT。

总结

梳理一下,结论如下:
1.静态以及简单场景字符串拼接,使用+
2.循环拼接场景使用StringBuilder
3.特定场景如果Joiner更给力就使用Joiner(理论上StringJoiner都支持)
4.集合转String等操作搭配stream、StringJoiner优雅实现
5.String + 、Joiner、StringJoiner底层均为StringBuilder实现
6.StringBuffer是线程安全版本的StringBuilder
7.String + 拼接在静态字符串场景下编译器会优化,生成的字节码是拼接后的字符串

参考

https://blog.csdn.net/rmn190/article/details/1492013 String,StringBuffer与StringBuilder对比
https://www.runoob.com/w3cnote/java-different-of-string-stringbuffer-stringbuilder.html String,StringBuffer与StringBuilder
https://www.jianshu.com/p/aa4242253645 String字符串拼接性能优化
https://www.apiref.com/java11-zh/java.base/java/lang/invoke/StringConcatFactory.html Class StringConcatFactory

原创不易,如果本文对您有帮助,欢迎关注我,谢谢 ~_~

String、StringBuilder、StringBuffer、StringConcatFactory相关推荐

  1. JAVA→封装类Wrapper、字符串String及其方法、==与equals()、正则表达式、StringBuilder与StringBuffer、内嵌类

    封装类 字符串String String常用方法 ==与equals(),StringBuilder,StringBuffer 基本类型和String转换 正则表达式 StringBuilder,St ...

  2. 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解

    1 碎碎念  这是一道老生常谈的问题了,字符串是不仅是 Java 中非常重要的一个对象,它在其他语言中也存在.比如 C++.Visual Basic.C# 等.字符串使用 String 来表示,字符串 ...

  3. 探秘Java中String、StringBuilder以及StringBuffer

    相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...

  4. java replace stringbuilder_【基础篇】揭开String、StringBuilder以及StringBuffer的神秘面纱...

    String这个类是Java中使用的最频繁的类之一,据本仔的不完全统计,这个类每月的使用量可饶地球-呃,三四五六圈,今天刚好用到了这个类,就简单的做个总结吧,让我们一起走进科学,探索神秘的String ...

  5. 【转】探秘Java中的String、StringBuilder以及StringBuffer

    探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...

  6. String、StringBuilder和StringBuffer的区别和用法

    分别使用使用这三种来拼接字符串,对比各自损耗的时间: 经过测试: package com.test;public class Main{public static void main(String[] ...

  7. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  8. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  9. Java:中的String,StringBuilder,StringBuffer三者的区别

    Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...

  10. String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer

    String的相关知识点 1. 不可变字符串String类对象 2. String不可变的好处 3.字符串常量池 4. String.StringBuilder和StringBuffer 1. 不可变 ...

最新文章

  1. 当NLPer爱上CV:后BERT时代生存指南之VL-BERT篇
  2. 2017年全球AI芯片公司大盘点
  3. matlab stract结构_MATLAB 的基础知识
  4. IGMP Internet组管理协议 未完
  5. boost::callable_traits的is_lvalue_reference_member的测试程序
  6. flag -- 诡异的memcache标记
  7. 在类中调用delete this问题
  8. python客户价值分析_航空公司客户价值分析实例
  9. SQL Server脏读方式数据提取---NOLOCK和READPAST
  10. html5游戏开发实战第三章,我的启蒙--HTML5 第三章 Canvas
  11. Qt Creator子目录项目-类似VS解决方案
  12. 华为OJ——C++版合集
  13. 《信号与系统》4.11.2系统函数的幅频特性和相频特性分析 MATLAB实现
  14. 华为网络技术比赛-云平台课件笔记
  15. OpenJudge NOI题库 入门 116题 (二)
  16. 狂神ajax,Ajax 学习笔记 by狂神说
  17. hhkb mac设置_HHKB MAC 配置指南 操作指南 快捷键
  18. 影像组学|影像组学导论
  19. python 获取当前目录 上一级目录 上上一级目录
  20. python中np.random.randint()函数

热门文章

  1. 遗传算法之: One Max Problem
  2. 贝叶斯概率推断(一):贝叶斯思维
  3. 凸函数优化问题的相关讨论
  4. mysql8多表连接_MySQL 多个表的 连接
  5. 阿玛尼搜索引擎收录_被全网黑的阿玛尼权利,我一个大干皮咋用的挺好?
  6. pymysql executemany()函数
  7. 多元线性回归实现代码
  8. pil对图像加透明 python_分享一个骚操作,用 Python 来 P 图
  9. 深度学习笔记(三):激活函数和损失函数
  10. POJ 3667 Hotel (线段树区间合并)