标签:
好吧,这算一个简单而又常见的问题了,但还是写一写,因为再高深一点我也感觉力不从心。
String是一个不可变的对象,也即任何意图修改某个String对象的行为都不得不变成新建一个利用修改的内容创建新的对象,所以经常修改String会带来大量的垃圾,增加GC的负担,致使程序性能变差,java引入StringBuffer类就是为了能够减少多余对象的创建。
String s1 = "mk",s2="ko",s3="jk"; String str = s1 + s2 + s3; StringBuffer strB = new StringBuffer().append(s1).append(s2).append(s3);
当连接更多String时,StringBuffer相比于String的性能优势会更加明显。
StringBuffer的设计是线程安全的,一下是一段StringBuffer的源码
public synchronized StringBuffer append(double d) { super.append(d); return this; } /** * @throws StringIndexOutOfBoundsException {@inheritDoc} * @since 1.2 */ public synchronized StringBuffer delete(int start, int end) { super.delete(start, end); return this; } /** * @throws StringIndexOutOfBoundsException {@inheritDoc} * @since 1.2 */ public synchronized StringBuffer deleteCharAt(int index) { super.deleteCharAt(index); return this; } /** * @throws StringIndexOutOfBoundsException {@inheritDoc} * @since 1.2 */ public synchronized StringBuffer replace(int start, int end, String str) { super.replace(start, end, str); return this; }
大部分的方法都是加锁的以保证线程安全,但大部分Java程序都是在单线程状态的,StringBuffer为线程安全所付出的巨大开销,性能也会受到影响,StringBuilder(无需保证线程安全)相比之下就显得更有优势了,所以在单线程环境下应尽量使用StringBuilder。
String、StringBuilder和StringBuffer
标签:
原文地址:http://www.cnblogs.com/yigeboke/p/4544367.html