常量字符串VS StringBuffer的串联

时间:2012-11-23 13:41:01

标签: java string concatenation stringbuffer

您可以为使用一个或另一个更好,更快,更正确的变体提供什么参数。

第一个变体:

StringBuffer sql = new StringBuffer("SELECT DISTINCT f.ID ")
    .append("FROM FIRST_TABLE F ")
        .append("LEFT JOIN SECOND_TABLE s ON f.ID = s.F_ID ")
    .append("WHERE ")
        .append("F.BOOL = 1 ")
        .append("AND S.DATE IS NOT NULL ")
        .append("AND S.CLOSED = 0 ");

第二种变体:

String sql = "SELECT DISTINCT f.ID " +
             "FROM FIRST_TABLE F " +
                "LEFT JOIN SECOND_TABLE s ON f.ID = s.F_ID " +
             "WHERE "
                "F.BOOL = 1 " +
                "AND S.DATE IS NOT NULL " +
                "AND S.CLOSED = 0";

*表示注释:Class StringClass StringBuffer

2 个答案:

答案 0 :(得分:11)

第二个更好:

  • 更清楚(更多代码与你想要的有关)
  • 它更高效,因为所有连接都是在编译时完成的

即使执行时间连接 是必需的(例如,你有一个变量),编译后的代码将使用StringBuilderStringBuffer所需的位置(取决于您要定位的Java版本。

请注意,如果您正在执行数据库查询,效率将完全无关紧要。

答案 1 :(得分:0)

你不应该浪费时间担心如何连接几个字符串。使用2并保持清晰。使用StringBuilder / buffer不是一个伟大的程序员的标志,如果这是你的想法。

担心模糊定义的要求和计划背后的事情。

试试这个 - >

long finalTime1 = 0; { long initialTimeTest = System.currentTimeMillis(); for(int index = 0; index< 10000; index ++){StringBuilder sb = new StringBuilder(“Hello,”)。append(“World”);的System.out.println(sb.toString()); } finalTime1 = System.currentTimeMillis() - initialTimeTest;

}

long finalTime2 = 0; { long initialTimeTest = System.currentTimeMillis(); for(int index = 0; index< 10000; index ++){String sb =“Hello,”+“World”; System.out.println(sb); } finalTime2 = System.currentTimeMillis() - initialTimeTest; }

System.out.println(finalTime1); System.out.println(finalTime2);

结果:

...你好,世界你好,世界245 148

您认为字符串缓冲区更快吗?

你打破了所有规则的母亲:保持简单。 -

对于普通的字符串处理,没有理由使用StringBuilder。它只会给平凡的任务带来不必要的复杂性。

我们需要考虑BIG,考虑模块对项目的整体业务影响。讨论我们是否将使用StringBuilder / Builder或String组装一些字符串的想法很少, - 不要这样做。

关于表现的问题,我建议:http://cfd.gmu.edu/~jcebral/academics/csi702/notes/02-optimization.pdf