String,StringBuilder和&之间的区别StringBuffer的?

时间:2015-06-18 10:27:08

标签: java multithreading thread-safety

我刚刚上网,但我找不到清楚的&精确

  

StringStringBuilder&之间的差异StringBuffer

     

请解释我们何时应该使用它们以及thread-safe的含义   在java?

2 个答案:

答案 0 :(得分:1)

我将澄清线程安全点。其他要点在较早的问题中有很好的描述。

StringBuffer满足您的需求时,这种情况非常罕见。虽然它是线程安全的,但它并不意味着你将从不同的线程中获得预期的结果。例如,假设您有以下代码:

StringBuffer buf = new StringBuffer();

public void appendMessage(String message) {
    buf.append("INFO: ").append(message).append(System.lineSeparator());
}

如果您在多线程环境中使用它,它不会失败,但您可能最终得到这样的内容:

INFO: INFO: thread1 message
thread2 message

这是因为个别append调用是同步的,但整个序列不同步。

为了确保单独添加邮件,您必须具有如下外部同步:

Object lock = new Object();
StringBuilder buf = new StringBuilder();

public void appendMessage(String message) {
    synchronized(lock) {
        buf.append("INFO: ").append(message).append(System.lineSeparator());
    }
}

这里整个调用序列是同步的,因此您将立即附加整个消息。当您使用外部同步时,StringBuilder也可以正常工作。

因此,一般情况下StringBuffer不应该在大多数情况下使用。

答案 1 :(得分:0)

String和StringBuilder / StringBuffer之间的主要区别在于String是不可变的,即您曾经初始化的String不能再被更改。重新定义String只会在内存中创建一个新的不可变String。 可以通过append(String str)或insert(StringBuffer sb)等方法修改StringBuilder / StringBuffer的实例。 StringBuilder / StringBuffer之间的唯一区别是StringBuilder对于多个线程使用是不安全的,而StringBuffer则是线程安全的。

因此,如果您想使用一次定义的字符串对象而不需要修改很多字符串对象,则使用String。如果你想使用它们,你可以使用StringBuilder,如果你想在多线程环境中这样做,你可以使用StringBuffer。