1.介绍。
String是典型的immutable类(不可变类)。不可变类就是类对象一旦创建后就完全不可改变。类和属性都是final修饰的。由于它的不可变性,所以对字符串的裁剪拼接等操作都会产生新的String对象,会影响性能。
StringBuilder:StringBuilder解决了String拼接产生多对象的问题,广泛用来拼接字符串。但是线程不安全。
StringBuffer:StringBuffer和StringBuilder相比没有本质区别,用法也基本一致。不同的是StringBuffer是线程安全的,实现线程安全的方式就是在各种修改数据的方法上都加上了synchronized关键字。
2.底层实现方式。
String是用数组来存储数据的(历史版本是char数组,java9开始使用byte数组加上一个标识编码的coder).
StringBuilder和StringBuffer底层都是利用科修改的数组(历史版本char数组,java9改为byte数组),二者都继承了AbstractStringBuilder。长度实现是初始字符串长度加16,超过的时候就再扩容,为了减少扩容的开销,如果一开始大小基本确定的话就指定大小。
3.String的创建机制。
java为了避免在一个系统中产生大量的String对象,引入了常量池,运行机制是创建一个字符创的时候首先检查常量池中有没有,如果有就直接引用,没有再创建新的字符创,并将新建的放入池中。注意:常量池中的字符创不会回收,所以尽量少的定义字符串。另外通过new方式创建的不会放在常量池。
4.字符串的intern方法。
intern方法目的是提示jvm把相应字符串缓存起来以备重复使用,我们创建字符串并调用inter的时候如果已经有缓存的字符串就返回缓存里的实例,否则将其缓存起来。但空间有限,使用不当会造成OOM(OutOfMemaryError)。
参考:杨晓峰《java核心技术36讲》