3 回答

TA贡献1824条经验 获得超6个赞
String
不允许附加。您在a上调用的每个方法都会String
创建一个新对象并将其返回。这是因为String
它是不可变的 - 它不能改变它的内部状态。
另一方面StringBuilder
是可变的。调用append(..)
它时会改变内部char数组,而不是创建新的字符串对象。
因此,拥有以下内容更有效:
StringBuilder sb = new StringBuilder();for (int i = 0; i < 500; i ++) { sb.append(i);}
而不是str += i
,它将创建500个新的字符串对象。
请注意,在示例中我使用循环。正如helios在评论中指出的那样,编译器会自动将表达式转换String d = a + b + c
为类似的表达式
String d = new StringBuilder(a).append(b).append(c).toString();
还需要注意的是有StringBuffer
除StringBuilder
。不同之处在于前者具有同步方法。如果将其用作局部变量,请使用StringBuilder
。如果它可能被多个线程访问,请使用StringBuffer
(这是罕见的)

TA贡献1824条经验 获得超8个赞
这是一个具体的例子,为什么 -
int total = 50000;
String s = "";
for (int i = 0; i < total; i++) { s += String.valueOf(i); }
// 4828ms
StringBuilder sb = new StringBuilder();
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); }
// 4ms
正如您所看到的,性能差异很大。
添加回答
举报