String 、 StringBuilder 和 StringBuffer 之间的区别?

Difference between String , StringBuilder & StringBuffer?

刚刚在网上搜了一下,没找到清楚准确的

difference between String ,StringBuilder & StringBuffer .

Please also explain when should we use them and what do we mean by thread-safe in java ?

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

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 不应该在大多数情况下使用。

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

所以如果你想使用你定义一次并且不需要修改很多的字符串对象,你使用String。如果你想在它们上工作,你可以使用 StringBuilder,如果你想在多线程环境中这样做,你可以使用 StringBuffer。