我一般都用String ,哪个好点啊?
解决方案 »
- js detachEvent 如何删除匿名函数事件程序
- 访问servlet......
- 使用CSS布局方式设计一个网站的首页
- 在html中被disable掉的控件就失效了吗?
- ◆◆伤心透了◆◆哪里有emf-sdo-runtime-2.0.0.zip非官方的网站下载,官方的网站下载得一天都没有下载下来
- 怎样取得数据库进行最后一次 insert 的 id?
- HELP!!! 看看这是为什么? 什么叫“javax.servlet.ServletException: [Microsoft][ODBC 驱动程序管理器] 无效的游标状态”, 谢了
- 请教啦,如何把数据库中blob字段存储的图片在jsp页面中显示出来?
- 如何刷新Modal窗口
- 关于function里边设置限制性全选的错误
- java 能不能找到一个方法格式化日期 转变传来的字符串(未知格式)
- 这个问题很急,在线等........................
关键看你的sql是一个字符串还是多个部分拼成的,如果是一个字符串用String,多个部分拼成的就必须用StringBuffer。另外,其实多数情况下,SQL是放在.properties文件里的。
不过如果你的sql很固定,没有必要拼接,那就领当别论了。
StringBuffer适用于字符串本身频繁变化的情况,比如经常附加一段新字符串到原字符串上;
String适合那些定义以后不怎么变化,只是引用他的情况
使用String还是StringBuffer?出于方便的考虑,我们在进行字符串的内容处理的时候往往会出现以下的代码:
String result="";
result+="ok";这段代码看上去好像没有什么问题,但是需要指出的是其性能很低,原因是java中的String类不可变的(immutable),这段代码实际的工作过程会是如何的呢?通过使用javap工具我们可以知道其实上面的代码在编译成字节码的时候等同的源代码是:
String result="";
StringBuffer temp=new StringBuffer();
temp.append(result);
temp.append("ok");
result=temp.toString();短短的两个语句怎么呢变成这么多呢?问题的原因就在String类的不可变性上,而java程序为了方便简单的字符串使用方式对+操作符进行了重载,而这个重载的处理可能因此误导很多对java中String的使用。
下面给出一个完整的代码:
1. public class Perf {
2. public static String detab1(String s)
3. {
4. if (s.indexOf('\t') == -1)
5. return s;
6. String res = "";
7. int len = s.length();
8. int pos = 0;
9. int i = 0;
10. for (; i < len && s.charAt(i) == '\t'; i++)
11. {
12. res += " ";
13. pos += 8;
14. }
15. for (; i < len; i++)
16. {
17. char c = s.charAt(i);
18. if (c == '\t') {
19. do {
20. res += " ";
21. pos++;
22. } while (pos % 8 != 0);
23. }
24. else {
25. res += c;
26. pos++;
27. }
28. }
29. return res;
30. }
31.
32. public static String detab2(String s)
33. {
34. if (s.indexOf('\t') == -1)
35. return s;
36. StringBuffer sb = new StringBuffer();
37. int len = s.length();
38. int pos = 0;
39. int i = 0;
40. for (; i < len && s.charAt(i) == '\t'; i++)
41. {
42. sb.append(" ");
43. pos += 8;
44. }
45. for (; i < len; i++) {
46. char c = s.charAt(i);
47. if (c == '\t') {
48. do {
49. sb.append(' ');
50. pos++;
51. } while (pos % 8 != 0);
52. }
53. else {
54. sb.append(c);
55. pos++;
56. }
57. }
58. return sb.toString();
59. }
60.
61. public static String testlist[] = {
62. "",
63. "\t",
64. "\t\t\tabc",
65. "abc\tdef",
66. "1234567\t8",
67. "12345678\t9",
68. "123456789\t"
69. };
70.
71. public static void main(String args[])
72. {
73. for (int i = 0; i < testlist.length; i++) {
74. String tc = testlist[i];
75. if (!detab1(tc).equals(detab2(tc)))
76. System.err.println(tc);
77. }
78.
79. String test_string =
80. "\t\tthis is a test\tof detabbing performance";
81. int N = 5000;
82. int i = 0;
83.
84. long ct = System.currentTimeMillis();
85. for (i = 1; i <= N; i++)
86. detab1(test_string);
87. long elapsed = System.currentTimeMillis() - ct;
88. System.out.println("String time = " + elapsed);
89.
90. ct = System.currentTimeMillis();
91. for (i = 1; i <= N; i++)
92. detab2(test_string);
93. elapsed = System.currentTimeMillis() - ct;
94. System.out.println("StringBuffer time = "
95. + elapsed);
96. }
97. }
执行以上代码的结果可以看到使用StringBuffer的版本的方法比使用String版本的一般都快十倍以上(本人使用的是JDK1.4.0),你可以执行一下看看结果到底如何。因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!也许这就是你的程序的性能瓶颈!
后面看公司里的系统,别人都用StringBuffer,问了我同事,也没说什么实质的东西,就知道这么写比较好,所以现在一直用这种方式,不仅是写SQL语句,还有其他的,需要字符串连接等功能的时候都会使用StringBuffer
JDK 1.6 + 改为 StringBuilder 实现了。
比如String str="";str=str+"aaa";
这样str就是两个对象,如果用StringBuilder就不存在这个问题了
毕竟是省点内存的
sql的开销更多在在数据库服务器那端吧?
个人认为,对数据库服务器来说,用String做sql效率最低。扯远了。
拼接我也用的string,呵呵,能占多少内存啊?
楼主去仔细看看string 和 stringbuffer的区别就知道了当要拼SQL语句的时候,string在对字符串进行操作的时候,都会重新产生一个对像,而stringbuffer不会,而是在原有的上面直接加上去,用append()方法当大量的字符串拼的时候,stringbuffer不会占内存些,呵呵
一般人都习惯用stringbuffer
StringBuffer可变,省内存
==================================================================
StringBuffer q = new StringBuffer(); //バッファ
String pdtnm_tableName = CssDAO.getWithDBO(GmPdtnm.TABLE_NAME); //PDT名称テーブル名の保存
// PDT名称DBのフィールド名称配列
String [] pdtnm_fields = new String [] {
GmPdtnm.pdtkind, GmPdtnm.cd1, GmPdtnm.cd2, GmPdtnm.cd3,
GmPdtnm.snm1, GmPdtnm.snm2, GmPdtnm.nm, GmPdtnm.entdttm,
GmPdtnm.dttm, GmPdtnm.who,
};
// Select句の作成
q.append("SELECT ");
for(int i = 0; i < pdtnm_fields.length; i++){
q.append(pdtnm_fields[i]).append(", ");
}
q.append(" CASE WHEN ").append(GmPdtnm.pdtkind).append("=").append(GmPdtnm.PDTKIND7_PDT);
q.append(" THEN LPAD(TRIM(").append(GmPdtnm.cd1).append("),2,'0') ");
q.append(" ELSE ").append(GmPdtnm.cd1).append(" END AS cd1Sort,");
q.append(" LPAD(").append(GmPdtnm.pdtkind).append(",2,'8') AS SORTKEY ");
// From句の作成
q.append(" FROM ").append(pdtnm_tableName).append(" ");
// Where句の作成
q.append(" WHERE NOT ( ").append(GmPdtnm.pdtkind).append("=").append(GmPdtnm.PDTKIND7_PDT);
q.append(" AND ").append(GmPdtnm.cd1).append("=").append(GmPdtnm.PDTKIND7_PDT).append(") ");
if (searchCondition != null) {
String searchCondition_pdtkind = (String)searchCondition.get(PdtnmScreenParams.Pdtkind);
String searchCondition_snm1 = (String)searchCondition.get(PdtnmScreenParams.Snm1);
String searchCondition_snm2 = (String)searchCondition.get(PdtnmScreenParams.Snm2);
boolean b_where = false;
// PDT種別条件の付加
if ( searchCondition_pdtkind != null && searchCondition_pdtkind.length() > 0){
b_where = MasterCommon.EditWildCard(q, GmPdtnm.pdtkind, searchCondition_pdtkind, b_where);
}
if ( searchCondition_snm1 != null && searchCondition_snm1.length() > 0){
b_where = MasterCommon.EditWildCard(q, GmPdtnm.snm1, searchCondition_snm1, b_where);
}
if ( searchCondition_snm2 != null && searchCondition_snm2.length() > 0){
b_where = MasterCommon.EditWildCard(q, GmPdtnm.snm2, searchCondition_snm2, b_where);
}
}
// Order by句の作成
q.append("order by SORTKEY,cd1Sort");
q.append(", ").append(GmPdtnm.cd2);
q.append(", ").append(GmPdtnm.cd3);=====================================
他让我觉得stringbuffer是大便
他让我觉得string是王道
(@#……¥*(@#……¥(*)#@……
为了一句sql
调试个几十遍是常有的事情。
@()#&¥(@#&)¥@
所以说技术要用新的好啊
看看那jdk1.4用stringbuffer
册~那~~
差距啊这就是
StringBuffer要好,不过现在还是习惯用String