为什么有字符串生成器时有字符串?
2022-08-31 11:17:27
我刚刚第一次遇到,并且感到惊讶,因为Java已经有一个非常强大的类,允许追加。StringBuilder
String
为什么是第二类?String
我在哪里可以了解更多有关 ?StringBuilder
我刚刚第一次遇到,并且感到惊讶,因为Java已经有一个非常强大的类,允许追加。StringBuilder
String
为什么是第二类?String
我在哪里可以了解更多有关 ?StringBuilder
String
不允许追加。在 上调用的每个方法都会创建一个新对象并返回该对象。这是因为是不可变的 - 它不能改变其内部状态。String
String
另一方面是可变的。调用它时会更改内部 char 数组,而不是创建新的字符串对象。StringBuilder
append(..)
因此,拥有以下功能会更有效:
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();
另请注意,除了 .不同之处在于前者具有同步方法。如果将其用作局部变量,请使用 。如果碰巧可以由多个线程访问它,请使用(这种情况很少见)StringBuffer
StringBuilder
StringBuilder
StringBuffer
这里有一个具体的例子来说明为什么 -
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
如您所见,性能差异很大。