Java 这会使StringBuilder的使用变得多余吗?

Java 这会使StringBuilder的使用变得多余吗?,java,string,immutability,stringbuilder,redundancy,Java,String,Immutability,Stringbuilder,Redundancy,如果我这样做: StringBuilder sb = new StringBuilder(); sb.append("somestring" + "hello" + "more strings" + "last one"); 这与: string s = "somestring"; s + "hello" + "more strings" + "last one"; 使用字符串生成器会变得毫无意义吗?因此需要使用: StringBuilder sb = new StringBuilder()

如果我这样做:

StringBuilder sb = new StringBuilder();
sb.append("somestring" + "hello" + "more strings" + "last one");
这与:

string s = "somestring";
s + "hello" + "more strings" + "last one";
使用字符串生成器会变得毫无意义吗?因此需要使用:

StringBuilder sb = new StringBuilder();
sb.append("somestring");
sb.append("hello");
sb.append("more strings");
sb.append("last one");

长问题的简短答案是“是”。

长问题的简短答案是“是”。

StringBuilder是可变的,但字符串不是可变的。 StringBuilder使这些字符串操作更加高效。
对于像您的示例这样的小型工作,您可能不会注意到其中的区别。

StringBuilder是可变的,但String不是。 StringBuilder使这些字符串操作更加高效。 对于像您的示例这样的小作品,您可能不会注意到它们之间的区别。

如果这是您在该代码片段中使用的所有
StringBuilder
,那么这确实是毫无意义的。如果在首次调用
append
后继续追加,那么它并非完全没有意义。不过,您的最后一个示例比前两个更有意义

我假设你帖子中的常量只是为了清楚起见。如果它们确实是常量,编译器将执行此操作,使第一个示例等效于

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");
如果这就是您在该代码片段中对
StringBuilder
的全部使用,那么它确实是毫无意义的。如果在首次调用
append
后继续追加,那么它并非完全没有意义。不过,您的最后一个示例比前两个更有意义

我假设你帖子中的常量只是为了清楚起见。如果它们确实是常量,编译器将执行此操作,使第一个示例等效于

StringBuilder sb = new StringBuilder();
sb.append("somestringhello");

查看使用StringBuilder的代码与简单连接字符串的代码的编译输出,我发现最新的编译器通常会使用StringBuilder,无论何时合适。话虽如此,请注意,在第一个示例中,您需要说's=s+“hello”;为了捕捉结果。

查看使用StringBuilder的代码与简单连接字符串的代码的编译输出,我发现最新的编译器通常会使用StringBuilder,无论何时合适。话虽如此,请注意,在第一个示例中,您需要说's=s+“hello”;为了捕获结果。

在第一种情况下,编译器将检测固定文本,并将其作为单个值内联。像

sb.append("somestring" + "hello" + "more strings" + "last one");
将被视为

sb.append("somestringhellomore stringslast one");
因此,它将只向StringBuilder追加一次



在第二种情况下,它会多次追加。

在第一种情况下,编译器将检测到固定文本,并将其作为单个值内联。像

sb.append("somestring" + "hello" + "more strings" + "last one");
将被视为

sb.append("somestringhellomore stringslast one");
因此,它将只向StringBuilder追加一次



在第二种情况下,它会多次追加。在多次追加元素时,应该使用
StringBuilder
StringBuffer
而不是字符串“+”操作。例如:

String s = new String();
for(int i=0; i < x; i++){
  s += i;
}
String s=新字符串();
对于(int i=0;i
因为这将被转换成(类似于):

String s=新字符串();
对于(int i=0;i
在每次迭代中(在字节码等价物中),您将创建一个
StringBuffer
,并将其转换为
String


有许多来源,但:;你没事。我在2010年左右做了一个关于这个问题的小研究,我对这个问题的认识可以追溯到那个时候。如果此后有其他改进,我不知道。

StringBuilder
StringBuffer
应在多次追加元素时使用,而不是字符串“+”操作。例如:

String s = new String();
for(int i=0; i < x; i++){
  s += i;
}
String s=新字符串();
对于(int i=0;i
因为这将被转换成(类似于):

String s=新字符串();
对于(int i=0;i
在每次迭代中(在字节码等价物中),您将创建一个
StringBuffer
,并将其转换为
String

有许多来源,但:;你没事。我在2010年左右做了一个关于这个问题的小研究,我对这个问题的认识可以追溯到那个时候。如果此后有其他改进,我不知道。

根据,无论如何,
+
操作符将转换为
StringBuilder

两个主要区别是:

  • 当您按照示例中的方式连接一组文字时。常量折叠将在编译时将这些单独的字符串转换为单个字符串,从而避免在运行时执行此操作

    “somestring”+“hello”+“more strings”+“last one”
    变为
    “somestringhellomore stringslast one”

  • 在循环或其他分支结构中连接时。使用
    +
    将创建多个
    StringBuilder
    实例,这些实例将在运行时使用更多内存和处理能力。(见附件)

  • 根据,无论如何,
    +
    操作符将转换为
    StringBuilder

    两个主要区别是:

  • 当您按照示例中的方式连接一组文字时。常量折叠将在编译时将这些单独的字符串转换为单个字符串,从而避免在运行时执行此操作

    “somestring”+“hello”+“more strings”+“last one”
    变为
    “somestringhellomore stringslast one”

  • 在循环或其他分支结构中连接时。使用
    +
    将创建多个
    StringBuilder
    实例,这些实例将在运行时使用更多内存和处理能力。(见附件)

  • 不断地折叠是行不通的