String,StringBuffer和StringBuilder之间的区别是什么?
2 个回答
别跟我提以前,我不太记得,也不喜欢。乔枫#### 1. String **特点:** - **不可变性**:`String` 是一个不可变的字符串对象,一旦创建就不能修改。每次对 `String` 的操作都会生成一个新的 `String` 对象。 - **底层实现**:`String` 底层是一个 `final` 类型的字符数组。 ```java private final char value[]; ``` **操作示例:** 每次进行字符串拼接操作(如使用 `+` 号)时,实际上是在堆上隐式地新建一个与原字符串相同的 `StringBuilder` 对象,然后调用其 `append` 方法进行拼接,最后转换回 `String` 对象。 ```java String str = "Hello"; str += " World"; // 实际上是:new StringBuilder(str).append(" World").toString(); ``` #### 2. StringBuffer **特点:** - **可变性**:`StringBuffer` 是一个可变的字符序列,适用于需要频繁修改字符串内容的场景。 - **线程安全**:`StringBuffer` 对方法加了同步锁(或对调用的方法加了同步锁),因此是线程安全的,适合在多线程环境中使用。 - **性能**:由于加了同步锁,`StringBuffer` 的性能比 `StringBuilder` 稍差一些。 **底层实现:** `StringBuffer` 继承了 `AbstractStringBuilder` 抽象类,其底层是一个可变的字符数组。 ```java public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { // 字符存储 char[] value; } ``` **操作示例:** ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 不会创建新的对象,直接在原对象上操作 ``` #### 3. StringBuilder **特点:** - **可变性**:`StringBuilder` 是一个可变的字符序列,适用于需要频繁修改字符串内容的场景。 - **非线程安全**:`StringBuilder` 没有对方法进行同步,因此是非线程安全的,但在单线程环境中性能比 `StringBuffer` 更高。 - **性能**:由于没有同步机制,`StringBuilder` 的性能优于 `StringBuffer`。 **底层实现:** `StringBuilder` 也继承了 `AbstractStringBuilder` 抽象类,其底层是一个可变的字符数组。 ```java public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence { // 字符存储 char[] value; } ``` **操作示例:** ```java StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 不会创建新的对象,直接在原对象上操作 ``` ### 总结 - **String**:不可变字符串,每次修改都会生成新的对象,适用于少量字符串操作和字符串常量。 - **StringBuffer**:可变字符串,线程安全,适用于多线程环境下频繁的字符串操作。 - **StringBuilder**:可变字符串,非线程安全,适用于单线程环境下频繁的字符串操作。 选择适合的字符串处理类可以大大提高程序的性能和安全性。发布于 2024-05-27 23:17 •IP属地 北京举报评论收藏
快乐出现的时候,就好好享受快乐。宁大**1.可变性** String是一个不可变类,任何对String改变都是会产生一个新的String对象,所以String类是使用final来进行修饰的。而StringBuffer和StringBuilder是可变类,对应的字符串的改变不会产生新的对象。 **2.执行效率** 当频繁对字符串进行修改时,使用String会生成一些临时对象,多一些附加操作,执行效率降低。 ```java stringA = StringA + "2"; //实际上等价于 { StringBuffer buffer = new StringBuffer(stringA) buffer.append("2"); return buffer.toString(); } ``` **3.线程安全** StringBuffer的读写方法都使用了synchronized修饰,同一时间只有一个线程进行操作,所以是线程安全的,而StringBuilder不是线程安全的。编辑于 2021-10-12 20:40 •IP属地 天津举报评论收藏
公众号进入网站体验更佳

