String、StringBuilder、StringBuffer、StringConcatFactory
字符串操作是编码中经常进行的操作。在实现字符串操作时,经常使用到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相关推荐
- JAVA→封装类Wrapper、字符串String及其方法、==与equals()、正则表达式、StringBuilder与StringBuffer、内嵌类
封装类 字符串String String常用方法 ==与equals(),StringBuilder,StringBuffer 基本类型和String转换 正则表达式 StringBuilder,St ...
- 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解
1 碎碎念 这是一道老生常谈的问题了,字符串是不仅是 Java 中非常重要的一个对象,它在其他语言中也存在.比如 C++.Visual Basic.C# 等.字符串使用 String 来表示,字符串 ...
- 探秘Java中String、StringBuilder以及StringBuffer
相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它 ...
- java replace stringbuilder_【基础篇】揭开String、StringBuilder以及StringBuffer的神秘面纱...
String这个类是Java中使用的最频繁的类之一,据本仔的不完全统计,这个类每月的使用量可饶地球-呃,三四五六圈,今天刚好用到了这个类,就简单的做个总结吧,让我们一起走进科学,探索神秘的String ...
- 【转】探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- String、StringBuilder和StringBuffer的区别和用法
分别使用使用这三种来拼接字符串,对比各自损耗的时间: 经过测试: package com.test;public class Main{public static void main(String[] ...
- 2.Java中String,StringBuilder以及StringBuffer的关系与区别
String StringBuffer StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...
- Java基础之String,StringBuilder,StringBuffer三者的区别
Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...
- Java:中的String,StringBuilder,StringBuffer三者的区别
Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...
- String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer
String的相关知识点 1. 不可变字符串String类对象 2. String不可变的好处 3.字符串常量池 4. String.StringBuilder和StringBuffer 1. 不可变 ...
最新文章
- 当NLPer爱上CV:后BERT时代生存指南之VL-BERT篇
- 2017年全球AI芯片公司大盘点
- matlab stract结构_MATLAB 的基础知识
- IGMP Internet组管理协议 未完
- boost::callable_traits的is_lvalue_reference_member的测试程序
- flag -- 诡异的memcache标记
- 在类中调用delete this问题
- python客户价值分析_航空公司客户价值分析实例
- SQL Server脏读方式数据提取---NOLOCK和READPAST
- html5游戏开发实战第三章,我的启蒙--HTML5 第三章 Canvas
- Qt Creator子目录项目-类似VS解决方案
- 华为OJ——C++版合集
- 《信号与系统》4.11.2系统函数的幅频特性和相频特性分析 MATLAB实现
- 华为网络技术比赛-云平台课件笔记
- OpenJudge NOI题库 入门 116题 (二)
- 狂神ajax,Ajax 学习笔记 by狂神说
- hhkb mac设置_HHKB MAC 配置指南 操作指南 快捷键
- 影像组学|影像组学导论
- python 获取当前目录 上一级目录 上上一级目录
- python中np.random.randint()函数