我刚刚上网,但我找不到清楚的&精确
String
,StringBuilder
&之间的差异StringBuffer
。请解释我们何时应该使用它们以及
thread-safe
的含义 在java?
答案 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。