面试题答案
一键面试内存管理不同
+
运算符:- 使用
+
运算符拼接字符串时,每执行一次+
操作,都会创建一个新的String
对象。因为String
类是不可变的,一旦创建,其内容就不能被修改。例如,当执行String s = "a" + "b" + "c";
时,实际上会先创建一个包含"ab"
的临时String
对象,然后再创建一个包含"abc"
的最终String
对象,中间的临时对象在后续不再使用时会等待垃圾回收。这会导致在内存中产生较多的中间对象,占用额外的内存空间。
- 使用
StringBuilder
:StringBuilder
类是可变的。当使用StringBuilder
进行字符串拼接时,它会在内部维护一个可变的字符数组。例如StringBuilder sb = new StringBuilder(); sb.append("a").append("b").append("c");
,所有的拼接操作都是在这个字符数组上进行的,只有在调用toString()
方法将其转换为String
对象时,才会创建一个新的String
对象。这大大减少了内存中临时对象的创建,提高了内存使用效率。
性能表现及原因
+
运算符:- 性能表现:在拼接多个字符串场景下,性能较差。
- 原因:如上述内存管理部分所讲,每次
+
操作都会创建新的String
对象,这不仅增加了内存开销,还涉及频繁的对象创建和垃圾回收操作。随着拼接字符串数量的增多,创建和销毁中间对象的开销会变得非常大,从而导致性能下降。
StringBuilder
:- 性能表现:在拼接多个字符串场景下,性能较好。
- 原因:由于
StringBuilder
是通过内部可变数组进行拼接,避免了大量中间String
对象的创建。它的append
方法只是在数组末尾添加字符,操作相对简单高效。只有在最终需要获取String
对象时才调用toString
方法创建新的String
,所以在拼接大量字符串时性能更优。