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。
网友评论