String是不可变类,jvm针对常用类通常都会有优化,譬如针对String就有String Pool的说法。
在进行字符串连接操作时,造成不要使用"+",而应用用StringBuffer来代替,当然,如果连接很少,用"+"代替也无伤大雅。
曾经做过测试,进行10000次"+"操作和和StringBuffer.append操作,二者的的耗时几乎不是一个数量级的。
通常可能前者耗时是几百几千ms而后者所耗时可能为0ms.
我将测试次数上升至10000 * 10的时候,前者通常要几分钟甚至数十分钟,而后者一般能很快完成。
为什么会产生这样的差异?
可以想一下,String是不可变类,那么每一次连接都会产生一个新的对象。
像我上面那样万次十万次的操作,那相当于产生了十万个对象。这样即使不考虑效率,
从内存开销来讲也是极不可取的。
在Jdk5.0中,增加了一个StringBuilder类,这个类和StringBuffer是一样的,唯一的区别是StringBuffer是线程安全的,StringBuilder不是线程安全的。
比较二者的差别,写一个小的程序测试一下即可,2个线程同时访问即可看出问题。
测试结果一般是StringBuffer会产生正确的结果,StringBuilder会出现异常(有时候出现OutofMemoryException)或者结果错误。
由于StringBuffer进行了线程同步,所以在单线程环境下,StringBuilder的效率自然比StringBuffer要好一些。
在多线程环境下,使用StringBuffer,否则极力推荐使用StringBuilder。
比如,在一些工具类,局部变量,都可以使用StringBuilder,因为局部变量根本就不会涉及到并发访问的问题。
一般的,除非使用StringBuffer作为类变量或者实例变量,都推荐使用StringBuilder。