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。
刚刚在网上搜了一下,没找到清楚准确的
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。