3

你可以给出什么论据来使用更好、更快、更正确的一种或另一种变体。

第一个变体:

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";

*注:String类和StringBuffer 类

4

2 回答 2

11

第二个更好:

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

即使需要执行时连接例如,您在其中有一个变量),编译后的代码也会在需要的地方使用 a StringBuilderor StringBuffer(取决于您所针对的 Java 版本)。

请注意,如果您正在执行数据库查询,那么效率将是微不足道的。

于 2012-11-23T13:42:09.780 回答
0

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

担心定义模糊的需求和进度落后的事情。

试试这个->

长最终时间1 = 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;

}

长最终时间2 = 0;{ long initialTimeTest = System.currentTimeMillis(); for(int index = 0; index < 10000; index++){ String sb = "Hello, " + "World"; System.out.println(某人); finalTime2 = System.currentTimeMillis() - initialTimeTest; }

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

结果:

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

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

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

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

我们需要从大处着眼,考虑模块对项目的整体业务影响。讨论我们是否应该使用 StringBuilder/Builder 或 String 组装一些字符串是很少考虑的, - 不要那样做。

To your question about performance, I recommend:http://cfd.gmu.edu/~jcebral/academics/csi702/notes/02-optimization.pdf

于 2013-07-10T00:05:28.517 回答