本帖最后由 紫薰iy 于 2014-10-22 12:22 编辑
public class TestStringBuffereBuillder {
final static int NUM = 100000000;
public static void main(String[] args) {
//测试的次数
for (int j = 0; j < 5; j++) {
System.out.print(j+" ");
testString();
testStringBuffere();
testStringBuilder();
}
}
public static void testString(){
String string = "mmmmxxxxyy";
long startTime = System.currentTimeMillis();
for (int i = 0; i < NUM; i++) {
//String类中的方法,用于在String后连接字符串
string.concat("88");
//截取新的字符串
string = string.substring(0, 10);
}
long endTime = System.currentTimeMillis();
System.out.print((endTime - startTime) + "ms ");
}
public static void testStringBuffere(){
StringBuffer stringBuffer = new StringBuffer("mmmmxxxxyy");
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < NUM; i++) {
//StringBuffer与StringBuillder中的方法,末尾添加字符串与删除制定位置的字符串
stringBuffer.append("88");
stringBuffer = stringBuffer.delete(10, 12);
}
long endTime1 = System.currentTimeMillis();
System.out.print((endTime1 - startTime1) + "ms ");
}
public static void testStringBuilder(){
StringBuilder stringBuilder = new StringBuilder("mmmmxxxxyy");
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < NUM; i++) {
stringBuilder.append("88");
stringBuilder = stringBuilder.delete(10, 12);
}
long endTime1 = System.currentTimeMillis();
System.out.println((endTime1 - startTime1) + "ms");
}
}
输出结果
可以看到,在大量对字符串的操作的情况下,String的效率要低得多。String是不可变的对象, 因此在每次对String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
而StringBuffere和StringBuilder之间相差的不是太大。使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffere。
|
|