象这种用加号定义一个String变量是否效率很低,我的意思是这里会不会生成多个中间String变量 String 类型的用"+"效率很差的,改用StringBuffer会好多的!至少好几倍 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 相应的"+"用 append方法替代! 楼上的说的有道理,因为,你在用”+“操作时,因为string类型是不可变的,所以,你没”+“一次,在物理上都是重新开辟内存的,所以效率自然第,而stringbuffer则不是,他是可变字符串,你可以用append进行追加。他始终用一块内存空间。 我见到的书都是这样说的String 的+ 操作效率较低,如果可能应该用StringBuffer但可能需要考虑代码的可读性如果是不变的,可以考虑放到资源文件里 谢谢大家参与,下午我写了个程序验证,发现大家都错了。原先我是想定义一个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); }} 真奇怪,我又作了实验,发现从(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"); 可能的原因是:常量字符串+常量字符串时,编译器将他们合并成为一个常量字符串,也就是说"cosnt a"+"const b"与"const aconst b"的效果是一样的。但是象这样子也非常慢:SQL = SQL + "const a";SQL = SQL + "const b";这时会生成中间临时的String对象。 //测试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); 为什么这个程序放不出音乐来 程序改错 swing中JTable怎样直接加到JScrollPane上 正则式<.*?>为什么不能匹配HTML的注释标签? 请问下面程序里最后一行this.repaint();是什么意思。。this是哪个对象 java里面用assert多不多 java虚拟机负载问题 一个有关静态变量的简单问题 Applet布局管理的问题! 菜鸟求助,做一个点击button自己播放本地mid文件的程序,运行出错 求真正的JAVA应用项目! 使用virtualcafe如何把字符转换为双精度
但可能需要考虑代码的可读性
如果是不变的,可以考虑放到资源文件里
原先我是想定义一个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); }
}
哪位高人解释一下(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");
但是象这样子也非常慢:
SQL = SQL + "const a";
SQL = SQL + "const b";
这时会生成中间临时的String对象。
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);