常量字符串的串联VS 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 String和Class StringBuffer。

第二个更好:

  • 它更清晰(更多的代码与您想要的内容有关)
  • 它更高效,因为所有的串联都是在编译时完成的

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

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

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

担心定义模糊的需求和落后于计划的事情。

试试这个->

long finalTime1=0;{longinitialTimeTest=System.currentTimeMillis();for(int index=0;index<10000;index++){StringBuilder sb=new StringBuilder("Hello,").append("World");System.out.println(sb.toString());}finalTime1=System.currentTimeMillis()-ininitialTimeTest;

}

long finalTime2=0;{longinitialTimeTest=System.currentTimeMillis();for(int index=0;index<10000;index++){String sb="你好"+"世界";System.out.println(sb);}finalTime2=System.currentTimeMillis()-ininitialTimeTest;}

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

最新更新