常量字符串VS StringBuffer的串联

old*_*old 3 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 ");
Run Code Online (Sandbox Code Playgroud)

第二种变体:

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";
Run Code Online (Sandbox Code Playgroud)

*for note:Class StringClass StringBuffer.

Jon*_*eet 11

第二个更好:

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

即使执行时间串联必需的(例如,你必须在有一个变量),编译后的代码将使用一个StringBuilderStringBuffer地方需要(取决于您的目标的Java版本).

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

  • @GanGnaMStYleOverFlowErroR:不,它不会.实际上,在这种情况下,它会生成*更少的*字符串,因为(第三次)连接将在编译时完成.而且,即使不是,编译器也会做正确的事情.请阅读http://www.yoda.arachsys.com/java/strings.html,如果您有特定的情况,请编译它,然后使用`javap`来查看实际发生的情况. (3认同)