【问题标题】:Concatenation of constant strings VS StringBuffer常量字符串的串联 VS StringBuffer
【发布时间】:2012-11-11 21:21:47
【问题描述】:

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

第一个变体:

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

【问题讨论】:

标签: java string concatenation stringbuffer


【解决方案1】:

第二个更好:

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

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

请注意,如果您正在执行数据库查询,那么效率将完全无足轻重。

【讨论】:

  • Ok thx,但是性能呢,对这部分问题最感兴趣?
  • @GanGnaMStYleOverFlowErroR:不,不会。事实上,在这种情况下,它会生成 更少 字符串,因为(第三次)连接将在编译时完成。同样,即使不是,编译器也会做正确的事情。请阅读yoda.arachsys.com/java/strings.html,如果您有特定的情况,请编译它,然后使用javap 看看实际会发生什么。
  • @enjoyLife:不,您仍然会得到带有StringBufferStringBuilder 的字符串常量。请阅读较早评论中的链接...如果您在单个表达式中提供所有内容,那么使用连接将至少同样有效。 StringBuilder 更适合循环之类的事情,您无法在单个表达式中表达整个操作。
  • +1 仅仅因为直接使用 StringBuilder 更复杂不会使其更高效。使用+ 要么a)在编译时被简化,要么b)用更少的代码做同样的事情。在任何情况下,无论生成的字符串有多大,与传递、解析和执行 SQL 的成本相比,它都不重要。
  • @enjoyLife:使用连接,编译器可以在编译时完成它可以做的事情,并在执行时使用 StringBuilder 完成其余的工作。所以它至少同样高效,并且更具可读性。
【解决方案2】:

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

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

试试这个 ->

long finalTime1 = 0; { long initialTimeTest = System.currentTimeMillis(); for(int index = 0; index

}

long finalTime2 = 0; { long initialTimeTest = System.currentTimeMillis(); for(int index = 0; index

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

结果:

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

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

您正在打破所有规则之母:保持简单。 -

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

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

关于性能的问题,我推荐:http://cfd.gmu.edu/~jcebral/academics/csi702/notes/02-optimization.pdf

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2015-06-21
    • 2011-07-02
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多