StringBuilder vs String(确切情况下)

时间:2014-05-10 15:58:36

标签: java string stringbuilder

我已经阅读了Java中的StringBuilder类,我想知道,执行某项任务的更有效方法是什么:
使用“+”连接:

 String result = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
       "<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:y=\"http://api.yandex.ru/yaru/\">"
       + "<title>" + (et_title.getText().toString()) + "</title>" +
       "<y:access>"+ privacymode +"</y:access>" +
       "<category scheme=\"urn:ya.ru:posttypes\" term=\"link\"/>"
       + "<y:meta>" + "<y:url>" + (et_link.getText().toString()) + "</y:url>" +
       "</y:meta>" +
       "<content>" + signature_select() + "</content>"
       + "</entry>";


 StringBuilder sb = new StringBuilder();                     
     sb.append( "<?xml version=\"1.0\" encoding=\"utf-8\"?>")
       .append("<entry xmlns=\"http://www.w3.org/2005/Atom\" xmlns:y=\"http://api.yandex.ru/yaru/\">")
       .append("<title>")
       .append(et_title.getText().toString())
       .append("</title>")
       .append("<y:access>"+ privacymode +"</y:access>")
       .append( "<category scheme=\"urn:ya.ru:posttypes\" term=\"link\"/>")
       .append("<y:meta>" + "<y:url>" + (et_link.getText().toString()) + "</y:url>" + "</y:meta>")
       .append( "<content>" + signature_select() + "</content>")
       .append("</entry>");
String result = sb.toString();

2 个答案:

答案 0 :(得分:0)

这看起来令人担心过早优化。如果这是一次性的代码并且没有在紧密循环中调用,为什么要担心优化呢?

话虽如此,大多数情况下,xml文本可以在文本文件中找到,而不是在程序中进行硬编码,然后你将使用循环和StringBuilder,即

  StringBuilder xmlSb = new StringBuilder();
  Scanner xmlScanner = new Scanner(Foo.class.getResourceAsStream(RESOURCE));
  while (xmlScanner.hasNextLine()) {
     xmlSb.append(xmlScanner.nextLine());
  }
  if (xmlScanner != null) {
     xmlScanner.close();
  }

  // parse and use your xml text here

答案 1 :(得分:0)

编辑 :看起来Java编译器会优化字符串连接(+)版本,因此两个版本都具有相同的性能,有利于第一个更具可读性。 将我以前的答案留给历史目的。

感谢您的评论!


StringBuilder 版本更好。

我还打破了StringBuilder版本中的其他连接,例如:

.append("<y:access>"+ privacymode +"</y:access>")

为:

.append("<y:access>")
.append(privacymode)
.append("</y:access>")

使用StringBuilder的最大优点是避免为每个连接分配新的字符串,而StringBuilder将仅在必要时分配和调整其内部字符数组的大小。如果你知道最终字符串的大小会更好。然后,您可以使用其最终大小初始化StringBuilder,并避免任何额外的内存分配。