In your particular example, none because the compiler internally uses StringBuilders 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 StringBuilders 和 10 Strings。
相反,在
StringBuilder sb= new StringBuilder() ;
for(int i= 0 ; i < 10 ; i++ )
sb.append( "a" );
String s= sb.toString() ;
仅创建 1StringBuilder和 1 String。
主要原因是编译器不够聪明,无法理解第一个循环等同于第二个循环并生成更高效的(字节)代码。在更复杂的情况下,即使是最聪明的编译器也不可能知道。StringBuilder如果你绝对需要这种优化,你必须通过显式使用 s来手动引入它。