前面一篇,我们介绍了String这个类,其中String类提供的一些方法中有些方法是基于StringBuffer实现的。在Java中如果涉及到频繁的字符串修改操作,建议采用StringBuilder和StringBuffer,肯定不用String类。肯定有人会问,StringBuilder和StringBuffer有什么区别呢?这个在面试中也经常被问道。就一句话,StringBuffer和StringBuilder的方法基本上是一样的,唯一的区别是StringBuffer是线程安全的,而StringBuilder不是。
StringBuilder和StringBuffer和String不一样,Stirng是不可变化的。但是StringBuilder和StringBuffer,它不是final的,可以修改。字符串最常见的操作就是添加和删除。这里写一个程序分别用String类和StringBuilder和StringBuffer,三种方法来对字符串添加的操作。看看分别耗时多少,而且前面一段提到StringBuilder不是线程安全,StringBuffer是线程安全。线程我们暂时不管,后面学习。线程安全,意味着有代价,那就是要慢一些。下面的例子,可以证明三种类对字符串添加操作的速度快慢对比。
package demo3;
/**
* create by Anthony on 2017/10/29
*/
public class StringBufferDemo {
private static final int ITERATIONS = 100000;
// 参考StringBuffer.java中的 initial capacity of 16 characters.
private static final int BufferSize = 16;
private void concatString(){
System.out.print("comcatString -> ");
long startTime = System.currentTimeMillis();
String concat = "";
for(int i = 0; i< ITERATIONS; i++){
concat += i % 10;
}
long endTime = System.currentTimeMillis();
System.out.print("length: "+ concat.length());
// 统计循环整个过程时间
System.out.println(" time: "+ (endTime - startTime));
}
//StringBuffer
private void concatStringBuffer(){
System.out.print("concatStringBuffer -> ");
long startTime = System.currentTimeMillis();
StringBuffer concat = new StringBuffer();
for(int i=0; i< ITERATIONS; i++){
concat.append(i % 10);
}
long endTime = System.currentTimeMillis();
System.out.print("length: "+ concat.length());
System.out.println(" time: "+ (endTime - startTime));
}
//StringBuilder
private void concatStringBuilder(){
System.out.print("concatStringBuilder -> ");
long startTime = System.currentTimeMillis();
StringBuilder concat = new StringBuilder();
for(int i=0; i< ITERATIONS; i++){
concat.append(i % 10);
}
long endTime = System.currentTimeMillis();
System.out.print("length: "+ concat.length());
System.out.println(" time: "+ (endTime - startTime));
}
public static void main(String args[]){
String str = new String("Hello ");
str += "BeiJing";
StringBuffer strb = new StringBuffer("Hello ");
strb.append("BeiJing");
StringBuilder strd = new StringBuilder("Hello ");
strd.append("BeiJing");
StringBufferDemo st = new StringBufferDemo();
System.out.println("Iterations:" + ITERATIONS);
System.out.println("Buffer:" + BufferSize);
st.concatStringBuffer();
st.concatString();
st.concatStringBuilder();
}
}
运行结果:
Iterations:100000
Buffer:16
concatStringBuffer -> length: 100000 time: 16
comcatString -> length: 100000 time: 4859
concatStringBuilder -> length: 100000 time: 4
结论就是,从操作效率来看:StringBuilder > StringBuffer > String。 所以,如果不考虑线程安全角度,尽量多用StringBuilder来操作字符串的修改。