1.String
String被称为字符串常量,常量意味着他是不可变量。 String是把数据存放在了常量池当中,因为所有的String,默认都是以常量形式保存。
在String的源码可以看见,String的底层是数组,但是它被final修饰,表示String只能赋值一次,不可再更改。进行字符串拼接,会产生许多无用的对象,导致不断的占用内存。
2.StringBuilder
StringBuilder作为一种可变字符串类型,它和String的不同在于StringBuilder可以对字符串进行,拼接、反序、替换、删减、插入等操作,进行操作时每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象。相比较其他数据类型,他可能更加类似于数组。当对于String类型的数据进行拼接的时候,底层调用的是StringBuilder对象,分别调用了append方法和ToString方法。
3.StringBuffer
StringBuffer和StringBuilder很相似,它们都是可变的字符串。通过查看源码可知,它们的继承的类,实现的接口都是一样的。这两个类在实现上不同的地方基本有两点:
1.StringBuffer在很多方法上加上了关键字synchronized,而StringBuilder没有。
2.StringBuffer新增了一个变量toStringCache,变量toStringCache是toString返回的最后一个值的缓存,每当修改StringBuffer时清除。
4.三者的比较
5.应用场景
1.如果要操作少量的数据用 String;
2.多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
3.单线程操作字符串缓冲区下操作大量数据用 StringBuilder。
6.性能测试
1.分别使用
String和StringBuilder、StringBuffer进行一个简单性能测试,对字符串进行拼接,测试循环拼接100000次。
下面是测试结果:
从最后的结果来看,在字符拼接上String和StringBuffer,StringBuilder完全不是一个量级的,所以在进行大量字符串拼接的时候采用StringBuffer和StringBuilder是最好的。