主要是对Java中的String,StringBuilder和StringBuffer类进行分析对比
结构
String,StringBuilder和StringBuffer都实现了CharSequence接口,用来进行字符串的相关操作,并且都定义为final class,意味着都不能够被继承,并且内部都是用char数组实现的。这里有一个显著的区别是:String的 char数组被定义为 final,意味着一旦确定是不可改变的,我们每当对字符串进行一些操作,比如得到substring,toLowerCase等时,最后都会new一个新的String对象;而 StringBuilder和StringBuffer的内部的char数组没有final修饰,它们都继承自AbstractStringBuilder,内部的char数组可以随时修改,动态扩容。其中StringBuilder和StringBuffer的一个显著区别是:StringBuffer的很多方法会用synchronized修饰,意味着StringBuffer是线程安全的,适合在多线程的时候使用。除了这个区别,StringBuilder和StringBuffer的其它一些方法基本上是一致的,感觉StringBuffer其实就是StringBuilder的一个多线程版本。
一些简单的使用建议
1、当不需要改变字符串的内容时,尽量使用String类。因为它是不可变的。
2、当需要改变字符串的内容,比如说对大量字符串进行一些拼接操作,这时候如果用String的话就比较麻烦,每次都会生成一个新的String,这将浪费大量的内存空间,并且需要多次垃圾回收操作,严重影响速度。一般的情况下是选用StringBuilder类,可以原地进行一些操作,比较方便快速。多线程情况下选择线程安全的StringBuffer类。在不考虑多线程的情况下,StringBuilder的效率是比StringBuffer高的。
性能测试
简单测试了String,StringBuilder和StringBuffer的字符串拼接效率。
|
|
运行结果:
拼接空字符串的结果: