使用String实现
public class StringConcatenationWithString {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
String result = "";
for (int i = 0; i < 10000; i++) {
result = result + i;
}
long endTime = System.currentTimeMillis();
System.out.println("使用String拼接耗时: " + (endTime - startTime) + " 毫秒");
}
}
使用StringBuilder实现
public class StringConcatenationWithStringBuilder {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
stringBuilder.append(i);
}
String result = stringBuilder.toString();
long endTime = System.currentTimeMillis();
System.out.println("使用StringBuilder拼接耗时: " + (endTime - startTime) + " 毫秒");
}
}
性能和内存占用差异及原理
- 性能差异:
- String:每次拼接都会创建一个新的字符串对象,因为String是不可变的。在拼接10000个字符串的过程中,会创建大量临时字符串对象,频繁的内存分配和回收会导致性能开销较大,耗时较长。
- StringBuilder:它是可变的字符序列,通过append方法在原有对象上进行操作,不会频繁创建新对象,性能较高,耗时较短。
- 内存占用差异:
- String:由于创建大量临时对象,内存占用随着拼接次数增加迅速上升,在拼接完成后,这些临时对象在垃圾回收之前一直占用内存。
- StringBuilder:在初始容量足够的情况下,不会频繁扩展内部数组,内存占用相对稳定,仅在需要扩展容量时会进行内存分配,但相比String创建大量对象,内存占用要少很多。