谁能帮我证明一下 :“String StringBuffer 性能比较↓”
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。
详见 http://binbin8497.javaeye.com/blog/489721
String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。
详见 http://binbin8497.javaeye.com/blog/489721
String 在做 "+" 的时候会new 一个新的StringBuffer,好像是new StringBuffer("This").append(new StringBuffer(" simple"));这样的,具体的记不清了。所以在循环中效率很差。
public static void main(String[] args) {
String str ="";
long t0=System.currentTimeMillis();
for(long i=0;i<10000;i++){
str+="a";
}
long t1=System.currentTimeMillis();
System.out.println(t1-t0);
StringBuffer s=new StringBuffer();
long t2=System.currentTimeMillis();
for(long i=0;i<10000;i++){
s.append("a");
}
long t3=System.currentTimeMillis();
System.out.println(t3-t2);
}
/*
* 用时间比较
*/
StringBuffer sf=new StringBuffer();
Date d=new Date();
long now=d.getTime();
for (int i = 0; i < 1000; i++) {
sf.append("/num00");
sf.append(i);
}
Date de=new Date();
long nowe=de.getTime();
System.out.println("StringBuffer 完成所需要的时间差:"+(nowe-now));
///////////////////////////////////////////
String s="";
Date ds=new Date();
long nows=ds.getTime();
for (int i = 0; i < 1000; i++) {
s=s+"/num00";
s=s+i;
}
Date dse=new Date();
long nowse=dse.getTime();
System.out.println("String 完成所需要的时间差:"+(nowse-nows));
在实际应用中,一般都是这样:
String S1= “This is only a”+ var + “ test”;
如果是这行代码,那你能说虚拟机能直接new一个字符串么?
循环1000次
Sring用的时间是:20
SrintBuffer用的时间是:10并且当我再次测试的时候的结果是
Sring用的时间是:20
SrintBuffer用的时间是:0接着再测试StringBuffer用的时间都是0
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < 100000; i++) {
stringBuffer.append(" ");
}
System.out.println("stringBuffer完毕"); String s = "";
for (int i = 0; i < 100000; i++) {
s += " ";
}
System.out.println("string完毕");
}
第一句话打印完之后一直在等
我想两者各有千秋吧
StringBuffer占有连续的内存,每次不需要开辟新的内存,直接把新的数据写入内存即可
如果较短字符的链接看不出有什么区别,如果连接的字符很长,就会发现速率相差有多大了
楼主可以测试一下
请看下面的StringTest3.java代码和输出结果。package com.performance.string;
/** This class shows the time taken by string concatenation at compile time and run time.*/
public class StringTest3 {
public static void main(String[] args){
//Test the String Concatination
long startTime = System.currentTimeMillis();
for(int i=0;i<5000;i++){
String result = "This is"+ "testing the"+ "difference"+ "between"+
"String"+ "and"+ "StringBuffer";
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken for string concatenation using + operator : "
+ (endTime - startTime)+ " milli seconds");
//Test the StringBuffer Concatination
long startTime1 = System.currentTimeMillis();
for(int i=0;i<5000;i++){
StringBuffer result = new StringBuffer();
result.append("This is");
result.append("testing the");
result.append("difference");
result.append("between");
result.append("String");
result.append("and");
result.append("StringBuffer");
}
long endTime1 = System.currentTimeMillis();
System.out.println("Time taken for String concatenation using StringBuffer : "
+ (endTime1 - startTime1)+ " milli seconds");
}
}
这是上面的代码的输出结果:
Time taken for String concatenation using + operator : 0 milli seconds
Time taken for String concatenation using StringBuffer : 50 milli seconds
很有趣地,+操作符居然比StringBuffer.append()方法要快,为什么呢?
这里编译器的优化起了关键作用,编译器像下面举例的那样简单地在编译期连接多个字符串。它使用编译期决定取代运行期决定,在你使用new关键字来创建String对象的时候也是如此。
编译前:
String result = "This is"+"testing the"+"difference"+"between"+"String"+"and"+"StringBuffer";
编译后:
String result = "This is testing the difference between String and StringBuffer";这里String对象在编译期就决定了而StringBuffer对象是在运行期决定的。运行期决定需要额外的开销当字符串的值无法预先知道的时候,编译期决定作用于字符串的值可以预先知道的时候,下面是一个例子。
编译前:
public String getString(String str1,String str2) {
return str1+str2;
}
编译后:
return new StringBuffer().append(str1).append(str2).toString();
运行期决定需要更多的时间来运行。
在你给的例子中
String result = "This is"+ "testing the"+ "difference"+ "between"+
"String"+ "and"+ "StringBuffer";
相当于
String result = "This is testing the difference between String and StringBuffer";
这是在编译期就决定了的 运行期做的事情就只是new了个对象而已而StringBuffer在编译期没有做任何事情 而在运行期做的事情不只new了个对象 并且做了很多append操作
String result = new String("");比String result = "";要慢
这到是真的
// String
public class StringAndStringBuffer {
public static void main(String [] args){
String str ="a";
for(int i = 0;i < 100;i++){
str = str + "a";
}
System.out.println(str);
}
}
上面代码中内存创建了100次
// StringBuffer
public class StringAndStringBuffer {
public static void main(String [] args){
StringBuffer str =new StringBuffer();
for(int i = 0;i < 100;i++){
str.append("a");
}
System.out.println(str);
}
}
上面代码中分配了一块内存
所以可以看出StringBuffer在效率上是比String高的
我觉得既然没有使用多线程,那么肯定是顺序进行程序的,当然是stringBuffer完毕后等待string完毕
http://topic.csdn.net/u/20080415/12/3f2b9589-e97c-4129-8941-011bd9203a98.html这个帖子 23 楼有关于 char[], StringBuilder, StringBuffer 的测试报告
http://topic.csdn.net/u/20080919/09/f42beecb-d099-462a-bd0f-bee849214f95.html
String result = "This is testing the difference between String and StringBuffer";
在运行期只是将result指向了常量池里的"This is testing the difference between String and StringBuffer"