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
实例,这些实例将在运行时使用更多内存和处理能力。(见附件)