String和StringBuffer以及StringBuilder比较

String是一个字符串常量,其中的值不可以改变,虽然可以书写如下代码

String s1 = "hello";
s1 = s1+"world";
System.out.println(s1);  //输出helloworld

但是此时在第二行的s1是在字符串常量池新建了一个helloworld字符串,然后将s1的引用指向helloworld字符串。

下面讨论效率
首先是String,通过50000次for循环改变String的值,代码如下:

int times = 50000;
long start = System.currentTimeMillis();
String string = "";
for (int i = 0; i < times; i++) {
    string += i;
}
long end = System.currentTimeMillis();
//6761毫秒
System.out.println(end - start + "毫秒");

然后是StringBuffer,同样是50000次for循环,代码如下:

int times = 50000;
long start = System.currentTimeMillis();
StringBuffer string = new StringBuffer();
for (int i = 0; i < times; i++) {
    string.append(i);
}
long end = System.currentTimeMillis();
//15毫秒
System.out.println(end - start + "毫秒");

最后是StringBuilder,同样是50000次for循环,代码如下:

//StringBuilder
int times = 50000;
long start = System.currentTimeMillis();
StringBuilder string = new StringBuilder();
for (int i = 0; i < times; i++) {
    string.append(i);
}
long end = System.currentTimeMillis();
//15毫秒
System.out.println(end - start + "毫秒");

总结:可见String拼接字符串耗时很长,如果采用StringBuilder或者StringBuffer,效率将会提高450倍之多。因此如果我们在编写代码的时候遇到需要拼接多次的字符串,我们尽量去使用StringBuilder或者StringBuffer,而StringBuffer的方法是线程安全的,因此,在多线程的情况下,我们应该使用StringBuffer,单线程的情况下我们可以使用StringBuilder。

你可能感兴趣的:(String和StringBuffer以及StringBuilder比较)