一分钟了解:String & StringBuilder & StringBuffer
这三个都是字符串对象,本篇就来分析下它们的使用途径,力求简单明了。
一、String
String 长度是不可变的,如果你要改变string对象的字符或者是拼接字符的话,系统就会新建一个string,然后把原来string的对象指向新的string。旧的string就等着被回收,所以你每次操作string的时候就会出现很多垃圾对象,效率不高。
二、StringBuffer
StringBuffer的长度是可变的,每次操作的时候都是对同一个stringBuffer进行操作的,如果要拼接字符的话,同它提供的append()方法就行了。这是一个线程安全对象。它的长度会根据你要存放的字符串来动态改变,涉及到先申请一个大小,如果不够了再扩大几倍的知识,这个咱们不管。
三、StringBuilder
StringBuilder是java5.0出来的新对象,长度也是可变的,和stringBuffer类似。特殊之处是它不是线程安全的,好处是效率比stringBuffer要高,两者的方法基本相同。
使用策略
-
1) 基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
-
2) 不要使用String类的”+”来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
-
3) StringBuilder一般使用在方法内部来完成类似”+”功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer主要用在全局变量中。
-
4) 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。
参考自:http://stormzhang.com/java/2014/08/08/java-string-stringbuilder-stringbuffer/