面试题答案
一键面试字符串拼接方式性能对比分析
- 直接使用 + 号拼接
- 原理:在Java中,使用 + 号拼接字符串时,编译器会将其转化为
StringBuilder
的append
方法调用,但是每次拼接都会创建一个新的StringBuilder
对象。例如:
- 原理:在Java中,使用 + 号拼接字符串时,编译器会将其转化为
String s1 = "Hello";
String s2 = " World";
String result = s1 + s2;
编译器转化后类似:
StringBuilder temp = new StringBuilder();
temp.append("Hello");
temp.append(" World");
String result = temp.toString();
- **性能测试**:
long startTime = System.currentTimeMillis();
String str = "";
for (int i = 0; i < 10000; i++) {
str += "a";
}
long endTime = System.currentTimeMillis();
System.out.println("使用 + 号拼接时间:" + (endTime - startTime) + "ms");
这种方式在循环拼接大量字符串时,由于不断创建 StringBuilder
对象,性能较差。
- 适用场景:适用于少量字符串拼接,代码简洁易读,例如 String greeting = "Hello, " + name + "!";
- 使用
StringBuilder
的append
方法拼接- 原理:
StringBuilder
是可变的字符序列,通过append
方法可以在原有对象上进行追加操作,避免了每次拼接都创建新对象。例如:
- 原理:
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" World");
String result = sb.toString();
- **性能测试**:
long startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append("a");
}
String result = sb.toString();
long endTime = System.currentTimeMillis();
System.out.println("使用 StringBuilder append 方法拼接时间:" + (endTime - startTime) + "ms");
在循环拼接大量字符串时,性能明显优于直接使用 + 号拼接。 - 适用场景:适用于需要频繁拼接字符串的场景,如日志记录、SQL语句构建等。
- 使用
Stream
的collect
方法构建StringBuilder
- 原理:
Stream
提供了一种流式处理数据的方式,collect
方法可以将流中的元素收集到StringBuilder
中。例如:
- 原理:
import java.util.stream.Collectors;
import java.util.stream.IntStream;
String result = IntStream.range(0, 10000)
.mapToObj(i -> "a")
.collect(Collectors.supplier(StringBuilder::new), StringBuilder::append, StringBuilder::append)
.toString();
- **性能测试**:
long startTime = System.currentTimeMillis();
String result = IntStream.range(0, 10000)
.mapToObj(i -> "a")
.collect(Collectors.supplier(StringBuilder::new), StringBuilder::append, StringBuilder::append)
.toString();
long endTime = System.currentTimeMillis();
System.out.println("使用 Stream collect 方法构建 StringBuilder 拼接时间:" + (endTime - startTime) + "ms");
在并行流的情况下,Stream
的 collect
方法性能优势明显,因为它可以利用多核处理器并行处理元素。
- 适用场景:当需要对集合元素进行并行处理并拼接成字符串时,Stream
的 collect
方法更合适,如处理大数据集的字符串拼接。
总结
- 少量字符串拼接:直接使用 + 号,代码简洁。
- 频繁字符串拼接:使用
StringBuilder
的append
方法,性能较好。 - 并行处理字符串拼接:使用
Stream
的collect
方法构建StringBuilder
,充分利用多核性能。