# `String`和`StringBuffer`之间的区别

> 原文： [https://beginnersbook.com/2014/08/string-vs-stringbuffer/](https://beginnersbook.com/2014/08/string-vs-stringbuffer/)

在上一篇文章中，我们讨论了[`StringBuffer`](https://beginnersbook.com/2014/08/stringbuilder-vs-stringbuffer/)和`StringBuilder`之间的差异。在这里，我们将讨论`String`和`StringBuffer`类之间的差异。

## `String` vs `StringBuffer`

1）**可变性**：**字符串**是不可变的（一旦创建，不能修改），而`StringBuffer`是可变的（可以修改）。

示例 - **字符串是不可变的：**

```java
String str = "Hello World";
str = "Hi World!";
```

通过查看此代码，您会说`str`的值已经改变，那么它如何变为不可变？让我解释一下：
在第一个语句中，使用字符串文字`"Hello World"`创建一个对象，在第二个语句中，当我们将新字符串文字`"Hi World!"`分配给`str`时，对象本身没有改变而是使用字符串文字`"Hi World!"`在内存中创建一个新对象，并将其引用分配给`str`。因此，基本上两个对象`"Hello World"`和`"Hi World!"`存在于具有不同引用（位置）的存储器中。

`StringBuffer`是可变的：

让我们看看`StringBuffer`的可变性

```java
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");

```

在第一个语句中，`StringBuffer`对象是使用字符串文字`"Hello"`创建的，而在第二个语句中，对象的值从`"Hello"`更改为`"Hello World"`。与字符串不同，对象被修改而不是创建新对象。

2）**性能**：在执行连接时，您应该优先选择`StringBuffer`而不是`String`，因为它更快。原因是：当您使用`String`连接字符串时，实际上每次都创建新对象，因为`String`是不可变的。

`StringBuffer`的 java 文档说了什么：

[**来自`StringBuffer` javadoc**](https://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html)：

一个线程安全，可变的字符序列。字符串缓冲区就像一个`String`，但可以修改。在任何时间点它都包含一些特定的字符序列，但序列的长度和内容可以通过某些方法调用来改变。
