从我理解它的方式以及一些文章,博客和线程中,我理解当一个循环构建一个字符串并且迭代次数未知时,StringBuilder很有用。最近我看到在构建sql字符串时使用了StringBuilder:
StringBuilder sql = new StringBuilder();
sql.Append("SELECT Field1, Field2";
sql.Append(" FROM Table1 WHERE ID=@ID ");
所以我的问题是 - 在上面的场景中使用StringBuilder是否优于常规String?或者这是个人偏好的问题?
更新:我的问题不是一般的String vs. StringBuilder。我刚看到一本教科书中的特定案例对我来说并不是特别有利,所以我想在这里与专家一起澄清
答案 0 :(得分:3)
使用StringBuilder
的决定需要自行决定:
String
常量,并且所有部分都是无条件连接并且顺序相同,则使用StringBuilder
是不利的。StringBuilder
可能会给您带来轻微的优势。具体来说,这段代码
string sql = "SELECT Field1, Field2" +
" FROM Table1 WHERE ID=@ID ";
比使用StringBuilder
的更好,因为它根本不连接字符串:C# compiler recognizes concatenation of string constants at compile time,并将部分粘贴到单个string
对象中。
答案 1 :(得分:0)
在C#中,字符串是不可变的,因此每次添加到字符串时,它都会创建一个新副本。使用TimerTask urTask = new TimerTask() {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
try {
PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
// PerformBackgroundTask this class is the class that you put your logic into
performBackgroundTask.execute();
} catch (Exception e) {
// TODO Auto-generated catch block
}
}
});
}
};
timer.schedule(doAsynchronousTask, 0, 30000); //execute in every 30 secs
,它在内存中保存不同的部分,然后StringBuilder
在最后创建它。
在这种情况下是否有利,很难说,因为你只是将两个字符串附加在一起而且它们相对较小。您加入的越多,字符串越大,与将字符串连接在一起并创建新字符串相比,ToString
将使用的内存越快,内存越少。
答案 2 :(得分:0)
由于你没有指定语言(Java和C#都有类似的StringBuilder
类),我将假设它是C#。
无论哪种方式,使用字符串连接和StringBuilder
之间的区别在你提交的情况下是如此之小,我会认为选择是一种风格问题。
就个人而言,如果我在C#中,我发现使用verbatim string literals是构建格式良好的SQL字符串的最简洁方法:
string sql = @"SELECT Field1, Field2
FROM Table1
WHERE Field1 = @field1
AND Field3 = @field3
ORDER BY Field2";
没有涉及连接,当我需要将SQL粘贴到代码中时,它非常实用。当然,字符串中有更多空格,但我通常根本不介意,并且在运行SQL时没有任何区别。
答案 3 :(得分:0)
这可能会帮助您选择。
发件人:https://www.tutorialsteacher.com/csharp/csharp-stringbuilder
“注意:连接多个字符串时,StringBuilder的执行速度比字符串快。如果要附加三个以上的四个字符串,请使用StringBuilder。附加两个或三个字符串比使用StringBuilder效率更高。”