谁能帮我证明一下 :“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

解决方案 »

  1.   

    对JVM不太懂,只是听前辈们说要尽量用stringBuffer代替string连接.......
      

  2.   

    String 的 "+" 也是通过StringBuffer实现的,基本上没区别,不过在循环中效率差别很大,建议使用StringBuffer。
    String 在做 "+" 的时候会new 一个新的StringBuffer,好像是new StringBuffer("This").append(new StringBuffer(" simple"));这样的,具体的记不清了。所以在循环中效率很差。
      

  3.   

    String和StringBuffer的主要区别是,对一个String变量的改变会不断的开辟内存空间的,用新的内存空间去保存新的String值,这样会造成系统资源的不必要浪费,StringBuffer是可变的字符串,它对字符串的操作才是真正的去修改原有字符串。
      

  4.   

    string不能够扩展字符串的数目,也就是说你定义多少就是多少,而stringbuffer定义的字符数组如果你输入的比定义的初值大,他会自动增加字符串的长度,你也可以用stringbuffer.append(string str)类方法向里面加字符串
      

  5.   


    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);

    }
      

  6.   

    最原始的
    /*
     * 用时间比较
     */
    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));
      

  7.   

    String S1= “This is only a”+ “ simple”+ “ test”; 谁有毛病把几个已知的字符串用这样相加的形式定义出来?图好看是么?
    在实际应用中,一般都是这样:
    String S1= “This is only a”+ var + “ test”;
    如果是这行代码,那你能说虚拟机能直接new一个字符串么? 
      

  8.   

    试验了下他们循环1000次用的时间
    循环1000次
    Sring用的时间是:20
    SrintBuffer用的时间是:10并且当我再次测试的时候的结果是
    Sring用的时间是:20
    SrintBuffer用的时间是:0接着再测试StringBuffer用的时间都是0
      

  9.   

    很简单啊试试这个就知道了 public static void main(String[] args) {
    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完毕");
    }
    第一句话打印完之后一直在等
      

  10.   

    那就是stringBuffer比string好了?为什么还有string呢?
    我想两者各有千秋吧
      

  11.   

    是的,就是未来好看。字符串太常的时候不换行吗?那你用append?
      

  12.   

    String只占有一个固定的内存 你每次连接的时候,需要开辟新的内存空间存放要连接的数据,然后数据写入内存,这样才算连接完毕
    StringBuffer占有连续的内存,每次不需要开辟新的内存,直接把新的数据写入内存即可
    如果较短字符的链接看不出有什么区别,如果连接的字符很长,就会发现速率相差有多大了
    楼主可以测试一下
      

  13.   

    如果只是一两个+号,那还是string快如果 是数量级别的,那当然是StringBuffer了!7楼的能测试出来的!
      

  14.   

    12 楼 huangyulin2015 说得还差不多6楼,7楼,9楼,麻烦再帮忙看看我的问题哦,你们for了一下和我问的那个不一样吧
      

  15.   

    编译期决定相对于运行期决定
    请看下面的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();
    运行期决定需要更多的时间来运行。
      

  16.   


    在你给的例子中
    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操作
      

  17.   

    另外我测试发现 如果仅仅是new对象 new StringBuffer比new String要慢
    String result = new String("");比String result = "";要慢
    这到是真的
      

  18.   

    StringBuffer和String的区别是StringBuffer是可变字符串,String是不可变字符串
    // 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高的
      

  19.   


    我觉得既然没有使用多线程,那么肯定是顺序进行程序的,当然是stringBuffer完毕后等待string完毕
      

  20.   

    参考这个帖子 42 楼的回复
    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
      

  21.   

    改正一下我在21楼的回复 一不小心说错了
    String result = "This is testing the difference between String and StringBuffer";
    在运行期只是将result指向了常量池里的"This is testing the difference between String and StringBuffer"