本篇文章介绍String,StringBuilder,StringBuffer和StringJoner的区别和使用,以及如何进行字符串拼接的常用方法
String
String类被final修饰,不可被继承,内部由一个被final字符数组实现,因此String是一个不可变类,这意味着对String的每次修改都会创建新的存储空间,而StringBuilder,StringBuffer都是字符串变量,是可以修改的。
如果执行String a=”abc”+”def”;,实际上经历了以下过程:
- 创建“abc”
- 创建“def”
- 合成“abcdef”
- 赋值给a
至于”+”号是如何实现拼接的,后面会讲到。
StringBuilder和StringBuffer
之所以把这两个合在一起说是因为它们基本用法都类似,它们都是字符串变量,即它们的值一般可以动态改变而不会多占据存储空间。
JDK1.8中对StringBuilder和StringBuffer定义为AbstractStringBuilder的子类,这也说明了两者有巨大的相似性,AbstractStringBuilder定义为如下结构(StringBuilder始于JDK1.5):
字符串数组value不被final修饰,证明value可变;由于存在count表示实际字符个数,这意味着value中的数据不是充满了整个value空间。
StringBuilder和StringBuffer的区别在于
1. StringBuilder是非线程安全的,StringBuffer是线程安全的
2. StringBuilder速度快,StringBuffer速度慢