In your particular example, none because the compiler internally uses StringBuilder
s to do String concatenation. If the concatenation occurred in a loop, however, the compiler could create several StringBuilder
and String
objects. For example:
String s= "" ;
for(int i= 0 ; i < 10 ; i++ )
s+= "a" ;
每次执行上面的第 3 行时,StringBuilder
都会创建一个新对象,并s
附加“a”的内容,然后将StringBuilder
转换为要分配回的字符串s
。共 10 StringBuilder
s 和 10 String
s。
相反,在
StringBuilder sb= new StringBuilder() ;
for(int i= 0 ; i < 10 ; i++ )
sb.append( "a" );
String s= sb.toString() ;
仅创建 1StringBuilder
和 1 String
。
主要原因是编译器不够聪明,无法理解第一个循环等同于第二个循环并生成更高效的(字节)代码。在更复杂的情况下,即使是最聪明的编译器也不可能知道。StringBuilder
如果你绝对需要这种优化,你必须通过显式使用 s来手动引入它。