💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# `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`,但可以修改。在任何时间点它都包含一些特定的字符序列,但序列的长度和内容可以通过某些方法调用来改变。