StringBuffer或HashMap用于附加代码?

时间:2010-09-24 07:07:25

标签: java

StringBuffer或HashMap

这是附加代码的最佳方式,也可以提高性能。

StringBuffer sql = new StringBuffer();
DBDatabase db = UTIL.getDatabase();
sql.append("SELECT I.FLDCODE, I.FLDDESCR, I.FLDWORKPHON FROM ");
sql.append(db.getSchema());
sql.append("TRNINSTR I, ");
sql.append(db.getSchema());
sql.append("TRNCRSIN C WHERE C.FLDCOURSE = ? AND C.FLDINSTRUCT = I.FLDCODE AND (I.FLDINACTIVE IS NULL OR I.FLDINACTIVE <> 'y') ORDER BY C.FLDSEQUENCE");
DBPreparedStatement stmt = new DBPreparedStatement(db, sql, "TrainPage.getInfoInstrList");
stmt.setString(1, courseType);
DBResultSet rs = stmt.executeQuery();
stmt.close();

2 个答案:

答案 0 :(得分:6)

StringBuilder表现得更好。请记住,缓慢的部分是数据库访问而不是语句准备。

答案 1 :(得分:2)

您的问题不清楚(“附加代码”?“HashMap”?),但我会假设您在询问构建字符串的更有效方法是什么。

通常,StringBuilder比StringBuffer更有效,因为后者的方法是同步的,这只是线程限制对象的不必要的开销。

但是问题是使用StringBuilder是否比简单的String连接更有效。答案就是“它取决于”。

如果要进行大量单独的连接,那么StringBuilder通常会更快; e.g。

String s = "";
for (int i = 0; i < 1000; i++) {
    s += "X";
}

如果你在一个表达式中进行所有连接,那么它可能没有区别:

String s = "Hi " + name + ". It is a might fine " + day + ".";

这是因为Java编译器会将其转换为创建StringBuilder并执行一系列append调用的代码。

然而,这是一个轻微的过度简化。一方面,如果您的应用程序可以轻松计算最终String的长度,则可以通过为构建器分配具有正确初始容量的StringBuilder来获得更好的性能。另一方面,编译器将预先评估字符串文字的连接,所以

String s = "Hi " + "mom" + ".  is a might fine " + "tuesday" + ".";

会比以下更快:

StringBuilder sb = new StringBuilder();
sb.append("Hi ");
sb.append("mom");
sb.append(".  is a might fine ");
sb.append("tuesday");
sb.append(".");
String s = sb.toString();

但最重要的是,可能无关紧要。除非您进行大量的字符串构建,否则对应用程序整体性能的影响可能会很小。