String 类型的用"+"效率很差的,改用StringBuffer会好多的!至少好几倍

解决方案 »

  1.   

    相应的"+"用 append方法替代!
      

  2.   

    楼上的说的有道理,因为,你在用”+“操作时,因为string类型是不可变的,所以,你没”+“一次,在物理上都是重新开辟内存的,所以效率自然第,而stringbuffer则不是,他是可变字符串,你可以用append进行追加。他始终用一块内存空间。
      

  3.   

    我见到的书都是这样说的String 的+ 操作效率较低,如果可能应该用StringBuffer
    但可能需要考虑代码的可读性
    如果是不变的,可以考虑放到资源文件里
      

  4.   

    谢谢大家参与,下午我写了个程序验证,发现大家都错了。
    原先我是想定义一个sql文,为了好看,就写成分行的形式,找不到换行符,后来听人说定义时加号就是换行符,也就是说定义String时与非定义的语句不同。看看下面的例子:
    import java.util.Date;class  TTT
    {
    public static void main(String[] args) 
    {
    Date before = new Date();
    long a,b;
    a = before.getTime();
    StringBuffer strBuff = new StringBuffer(1280000); for (int i=0; i<1000; i++ )
    {
      final String SQL =
            "SELECT \n"+
            "TRIM(A.FML_CUST_NM) FML_CUST_NM,\n"+               
            "TRIM(A.CAI_BANK_NM) CAI_BANK_NM,\n"+                
            "TRIM(A.CAI_BRANCH_NM) CAI_BRANCH_NM,\n"+            
            "TRIM(A.CAI_ACC_TP) CAI_ACC_TP,\n"+                
            "TRIM(A.CAI_ACC_NO) CAI_ACC_NO,\n"+                
            "TRIM(A.CAI_ACC_NM) CAI_ACC_NM,\n"+                 
            "TRIM(A.PAY_MTD) PAY_MTD,\n"+                  
            "TRIM(A.CUST_REMIT_MTD) CUST_REMIT_MTD,\n"+             
            "TRIM(A.CUST_BANK_CHARGE_TP) CUST_BANK_CHARGE_TP,\n"+        
            "TRIM(A.CUST_CMPNY_BANK_CHARGE_EXPL) CUST_CMPNY_BANK_CHARGE_EXPL,\n"+
            "TRIM(A.CAI_ACC_REMARK) CAI_ACC_REMARK,\n"+             
            "A.INVOECE_DATE_PICC_TP INVOECE_DATE_PICC_TP,\n"+      
            "TRIM(A.INVOICE_DATE_REMARK) INVOICE_DATE_REMARK,\n"+       
            "A.CLOSE_DATE_PICC_TP CLOSE_DATE_PICC_TP,\n"+         
            "TRIM(A.INCOME_CLOSE_DATE_REMARK) INCOME_CLOSE_DATE_REMARK,\n"+   
            "A.INCOME_DATE_PICC_TP INCOME_DATE_PICC_TP,\n"+        
            "TRIM(A.INCOME_DATE_REMARK) INCOME_DATE_REMARK,\n"+        
            "TRIM(A.SITE_TP) SITE_TP,\n"+                    
            "TRIM(A.CRI_BANK_CD) CRI_BANK_CD,\n"+                
            "TRIM(A.CRI_BRANCH_CD) CRI_BRANCH_CD,\n"+             
            "TRIM(A.CRI_ACC_TP) CRI_ACC_TP,\n"+                
            "TRIM(B.ACC_NO) ACC_NO,\n"+                     
            "TRIM(B.ACC_NM) ACC_NM,\n"+                    
            "TRIM(A.INCOME_MTD) INCOME_MTD,\n"+                 
            "TRIM(A.OUR_CMPNY_REMIT_MTD) OUR_CMPNY_REMIT_MTD,\n"+        
            "TRIM(A.OUR_CMPNY_BANK_CHARGE_TP) OUR_CMPNY_BANK_CHARGE_TP,\n"+   
            "TRIM(A.OUR_CMPNY_BANK_CHARGE_EXPL) OUR_CMPNY_BANK_CHARGE_EXPL,\n"+ 
            "TRIM(A.CRI_ACC_REMARK) CRI_ACC_REMARK\n"+              
            "FROM CUST A, CUST_BAI B\n";
    strBuff.append(SQL);
    }
    Date after = new Date();
    b = after.getTime();
    System.out.println(b-a);
    Date before2 = new Date();
    long a2,b2;
    a2 = before2.getTime();
    StringBuffer strBuff2 = new StringBuffer(1280000); for (int i2=0; i2<1000; i2++ )
    {  
            strBuff2.append("SELECT \n");
            strBuff2.append("TRIM(A.FML_CUST_NM) FML_CUST_NM,\n");               
            strBuff2.append("TRIM(A.CAI_BANK_NM) CAI_BANK_NM,\n");               
            strBuff2.append("TRIM(A.CAI_BRANCH_NM) CAI_BRANCH_NM,\n");             
            strBuff2.append("TRIM(A.CAI_ACC_TP) CAI_ACC_TP,\n");               
            strBuff2.append("TRIM(A.CAI_ACC_NO) CAI_ACC_NO,\n");                
            strBuff2.append("TRIM(A.CAI_ACC_NM) CAI_ACC_NM,\n");                
            strBuff2.append("TRIM(A.PAY_MTD) PAY_MTD,\n");                    
           strBuff2.append("TRIM(A.CUST_REMIT_MTD) CUST_REMIT_MTD,\n");             
            strBuff2.append("TRIM(A.CUST_BANK_CHARGE_TP) CUST_BANK_CHARGE_TP,\n");        
            strBuff2.append("TRIM(A.CUST_CMPNY_BANK_CHARGE_EXPL) CUST_CMPNY_BANK_CHARGE_EXPL,\n");
            strBuff2.append("TRIM(A.CAI_ACC_REMARK) CAI_ACC_REMARK,\n");            
            strBuff2.append("A.INVOECE_DATE_PICC_TP INVOECE_DATE_PICC_TP,\n");       
            strBuff2.append("TRIM(A.INVOICE_DATE_REMARK) INVOICE_DATE_REMARK,\n");        
            strBuff2.append("A.CLOSE_DATE_PICC_TP CLOSE_DATE_PICC_TP,\n");        
            strBuff2.append("TRIM(A.INCOME_CLOSE_DATE_REMARK) INCOME_CLOSE_DATE_REMARK,\n");   
            strBuff2.append("A.INCOME_DATE_PICC_TP INCOME_DATE_PICC_TP,\n");       
            strBuff2.append("TRIM(A.INCOME_DATE_REMARK) INCOME_DATE_REMARK,\n");         
            strBuff2.append("TRIM(A.SITE_TP) SITE_TP,\n");                    
            strBuff2.append("TRIM(A.CRI_BANK_CD) CRI_BANK_CD,\n");               
            strBuff2.append("TRIM(A.CRI_BRANCH_CD) CRI_BRANCH_CD,\n");          
            strBuff2.append("TRIM(A.CRI_ACC_TP) CRI_ACC_TP,\n");                
            strBuff2.append("TRIM(B.ACC_NO) ACC_NO,\n");                    
            strBuff2.append("TRIM(B.ACC_NM) ACC_NM,\n");                   
            strBuff2.append("TRIM(A.INCOME_MTD) INCOME_MTD,\n");                
            strBuff2.append("TRIM(A.OUR_CMPNY_REMIT_MTD) OUR_CMPNY_REMIT_MTD,\n");       
            strBuff2.append("TRIM(A.OUR_CMPNY_BANK_CHARGE_TP) OUR_CMPNY_BANK_CHARGE_TP,\n");   
            strBuff2.append("TRIM(A.OUR_CMPNY_BANK_CHARGE_EXPL) OUR_CMPNY_BANK_CHARGE_EXPL,\n"); 
            strBuff2.append("TRIM(A.CRI_ACC_REMARK) CRI_ACC_REMARK\n");             
            strBuff2.append("FROM CUST A, CUST_BAI B\n");
    } Date after2 = new Date();
    b2 = after2.getTime();
    System.out.println(b2-a2); }
    }
      

  5.   

    真奇怪,我又作了实验,发现从(1)到(4)越来越慢。
    哪位高人解释一下(1)
    String SQL = "";
    SQL = "A" + "B";
    (2)
    String SQL = "A" + "B";
    (3)
    StringBuffer sbuff = new StringBuffer(容量)
    StringBuff.append("A");
    StringBuff.append("B");
    (4)
    StringBuffer sbuff = new StringBuffer( )
    StringBuff.append("A");
    StringBuff.append("B");
      

  6.   

    可能的原因是:常量字符串+常量字符串时,编译器将他们合并成为一个常量字符串,也就是说"cosnt a"+"const b"与"const aconst b"的效果是一样的。
    但是象这样子也非常慢:
    SQL = SQL + "const a";
    SQL = SQL + "const b";
    这时会生成中间临时的String对象。
      

  7.   

    //测试string+与stringbuffer.append,结论,后者的性能大于前者500倍以上
        String ls_test="",ls_temp="fuckck";
        long ll_start,ll_end;
        StringBuffer lsb_test=new Strinuffer();
        ll_start=System.currentTimeMill();
        for (int i=0;i<500000;i++)
            lsb_test.append(ls_temp);
        ll_end=System.currentTimeMillis;
        System.out.println("consume:"+(_end-ll_start));
        
        ll_start=System.currentTimeMill();
        for (int i=0;i<5000;i++)
            ls_test+=ls_temp;
        ll_end=System.currentTimeMillis;
        System.out.println("consume:"+(_end-ll_start));
        //System.out.println(lsb_test);