MST

星途 面试题库

面试题:Java字符串拼接:String和StringBuilder性能分析

假设你需要拼接10000个字符串元素,分别使用String和StringBuilder实现该操作,并分析两者在性能和内存占用上的差异,说明背后的原理。
21.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

使用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创建大量对象,内存占用要少很多。