Java StringBuilder与String(在确切情况下)

Java StringBuilder与String(在确切情况下),java,string,stringbuilder,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>"

我已经读过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>";
String result=“”+
""
+“”+(et_title.getText().toString())+“”+
“”+privacymode+“”+
""
+“”+“”+(et_link.getText().toString())+“”+
"" +
“”+签名\u选择()+“”
+ "";

 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();
StringBuilder sb=新建StringBuilder();
某人加上(“”)
.附加(“”)
.附加(“”)
.append(et_title.getText().toString())
.附加(“”)
.append(“+privacymode+”)
.附加(“”)
.append(“+”+(et_link.getText().toString())+“+”)
.append(“+签名\选择()+”)
.附加(“”);
字符串结果=sb.toString();

这似乎是对过早优化的担忧。如果这是一段一次性的代码,并且没有在一个紧密的循环中被调用,那么为什么要担心优化呢

话虽如此,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
编辑:看起来Java编译器将优化字符串连接(+)版本,因此两个版本的性能都相同,第一个版本的优点是可读性更好。 为了历史的目的留下我以前的答案

谢谢你的评论


StringBuilder版本更好

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

.append("<y:access>"+ privacymode +"</y:access>")
.append(“+privacymode+”)
作为:

.append(“”)
.append(privacymode)
.附加(“”)

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

根据经验,使用前者。让编译器为您进行优化。这似乎是对过早优化的担忧。如果这是一段一次性的代码,并且没有在一个紧密的循环中被调用,那么为什么要担心优化呢?话虽如此,xml文本通常是在文本文件中找到的,而不是在程序中硬编码的。为什么要破坏内部连接?@Kondra007,因为内部连接将创建两个新字符串(在我的示例中)在将参数传递到append函数之前。我想了解为什么有人投票否决我…否决票被否决票作废。使用StringBuilder的最大优点是避免为每个串联分配新字符串。我没有否决票,但该语句不正确(也许值得投否决票?)。更多信息,请阅读指向重复问题的链接。
.append("<y:access>")
.append(privacymode)
.append("</y:access>")