为什么有字符串生成器时有字符串?

2022-08-31 11:17:27

我刚刚第一次遇到,并且感到惊讶,因为Java已经有一个非常强大的类,允许追加。StringBuilderString

为什么是第二类?String

我在哪里可以了解更多有关 ?StringBuilder


答案 1

String不允许追加。在 上调用的每个方法都会创建一个新对象并返回该对象。这是因为是不可变的 - 它不能改变其内部状态。StringString

另一方面是可变的。调用它时会更改内部 char 数组,而不是创建新的字符串对象。StringBuilderappend(..)

因此,拥有以下功能会更有效:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

而不是 ,这将创建 500 个新的字符串对象。str += i

请注意,在示例中,我使用了一个循环。正如helios在注释中指出的那样,编译器会自动将类似表达式转换为类似String d = a + b + c

String d = new StringBuilder(a).append(b).append(c).toString();

另请注意,除了 .不同之处在于前者具有同步方法。如果将其用作局部变量,请使用 。如果碰巧可以由多个线程访问它,请使用(这种情况很少见)StringBufferStringBuilderStringBuilderStringBuffer


答案 2

这里有一个具体的例子来说明为什么 -

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

如您所见,性能差异很大。