String、StringBuffer和StringBuilder的区别

224

请告诉我一个实时情景来比较 StringStringBufferStringBuilder

12个回答

2
在Java中,String是不可变的。不可变意味着一旦创建了一个String对象,我们就不能改变它的值。 StringBuffer是可变的。一旦创建了一个StringBuffer对象,我们只需将内容附加到对象的值上,而不是创建一个新对象。 StringBuilder类似于StringBuffer,但它不是线程安全的。StringBuilder的方法不是同步的,但与其他字符串相比,它运行速度最快。 您可以通过实现它们来学习String、StringBuilder和StringBuffer之间的区别

0
这是一个小的代码片段,演示了您如何在异步环境中打破 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可以解决该问题。更详细的信息在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接