请告诉我一个实时情景来比较 String
,StringBuffer
和 StringBuilder
?
请告诉我一个实时情景来比较 String
,StringBuffer
和 StringBuilder
?
public static void main(String[] args) throws InterruptedException {
StringBuilder builder = new StringBuilder();
ExecutorService executorService = Executors.newFixedThreadPool(50);
for (int i = 0; i < 1000 * 1000; i++) {
executorService.submit(new AppendRunnable(builder));
}
executorService.shutdown();
executorService.awaitTermination(1, TimeUnit.MINUTES);
Stream.of(builder.toString().split(System.lineSeparator()))
.filter(line -> !line.equals("I just appended this!"))
.forEach(System.out::println);
}
record AppendRunnable(StringBuilder stringBuilder) implements Runnable {
@Override
public void run() {
stringBuilder.append("I just appended this!\n");
}
}
本质上,我们将字符串附加到构建器中,并期望它们都等于“我刚刚添加了这个!”。但是它们并不是,因为构建器的内部字符缓冲区没有同步,它被错误地调整大小并在某些字符串前加上了null chars。在这种情况下使用StringBuffer可以解决该问题。更详细的信息在这里。