StringBuilder和StringBuffer的区别
StringBuffer
和StringBuilder
的主要区别是什么? 在决定其中的任何一个时,是否有任何性能问题?
StringBuffer
是同步的, StringBuilder
不是。
StringBuilder
比StringBuffer
快,因为它没有synchronized
。
这是一个简单的基准测试:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
测试运行给出的数字2241 ms
为StringBuffer
VS 753 ms
为StringBuilder
。
基本上, StringBuffer
方法是同步的,而StringBuilder
不是。
这些操作“几乎”相同,但在单个线程中使用同步方法是矫枉过正的。
这很关键。
来自StringBuilder API的报价:
这个类[StringBuilder]提供了一个与StringBuffer兼容的API, 但不保证同步 。 此类用于在单个线程正在使用字符串缓冲区的位置(如通常情况下)用作StringBuffer的嵌入式替换。 在可能的情况下,建议将此类优先用于StringBuffer,因为在大多数实现中它会更快。
所以它取而代之。
Vector
和ArrayList
。