String , StringBuilder StringBuffer 的区别

本文详细解析了Java中String,StringBuilder与StringBuffer的区别,包括它们的存储位置、可变性及线程安全性等特性。通过实例帮助读者理解这些类在实际应用中的差异。

引言

String , StringBuilder StringBuffer 的区别,这个问题是面试中经常被问到的经典问题,今天有空,整理下,顺便翻译下国外的一篇文章,以分享给大家,希望对各位有所帮助,也欢迎大家在评论区指出文章不足之处,讨论交流String , StringBuilder StringBuffer 的区别。谢谢各位!

原文来源

如果你英文很不错,还是看原文比较好

Difference Between String , StringBuilder And StringBuffer Classes With Example : Java

译文

Difference Between String , StringBuilder And StringBuffer Classes With Example : Java

今天我们要理解下String , StringBuilder StringBuffer 的区别。并且你会发现在以上提到的类中有微小的区别

String

String 是 不可变的对象(一旦创建 就不能被改变)。String 对象被存储在Constant String Pool中(字符串池)。Java中每一个不变的对象都是线程安全的,这意味着String也是线程安全的。String 不能同时被两个线程使用。

String  demo = " hello " ;
//上面的对象被被存储在Constant String Pool中(字符串池),它的值不能被改变
demo="Bye" ;//新的“Bye”字符串在字符串池中被创建,并且被demo 引用
//“hello”字符串仍然存在在字符串池,它的值也没有被重新,但是我们失去了对“hello”字符串的引用

StringBuffer

StringBuffer 是可变的,意味着你可以改变对象的值。StringBuffer创建的对象被保存在“堆”上。StringBuffer与StringBuilder有相同的方法,但是StringBuffer中的每一个方法都是同步的,也就是线程安全的。

所以, 它不允许连个线程同时进入同一个方法。一个方法一次只能被一个线程访问。

但是线程安全也有劣势。StringBuilder比StringBuffer更快。

StringBuffer 可以转换成String类型通过 toString 方法。

StringBuffer demo1 = new StringBuffer("Hello") ;
// The above object stored in heap and its value can be changed .
上面这个对象存储在堆上,其值可以被改变
demo1=new StringBuffer("Bye");
// Above statement is right as it modifies the value which is allowed in the StringBuffer
上面的代码是正确的,并且它修改了StringBuffer的值

StringBuilder

StringBuilder 也是讲创建的对象存储在堆上。主要区别在于StringBuilder是线程不安全的,所以StringBuilder更快一些。

StringBuilder demo2= new StringBuilder("Hello");
// The above object too is stored in the heap and its value can be modified
//上面这个对象存储在堆上,其值可以被改变

demo2=new StringBuilder("Bye"); 
// Above statement is right as it modifies the value which is allowed in the StringBuilder
//上面的代码是正确的,并且它修改了StringBuilder的值

对比

指标StringStringBufferStringBuilder
存储地字符串池
是否可变不可变可变可变
线程是否安全线程安全线程安全线程不安全
速度表现较慢
在 Java 中,`String`、`StringBuilder` 和 `StringBuffer` 都用于处理字符串,但它们有着明显的区别: ### 1. **String** - **不可变性**:一旦创建了 `String` 对象,就不能修改它的内容。每次对 `String` 的操作实际上都会生成一个新的 `String` 实例。 - **线程安全**:由于它是不可变的,因此天生就是线程安全的。 - **性能考虑**:频繁地拼接字符串会带来较大的开销,因为每次都需要创建新对象并复制原有数据。 #### 示例: ```java String s = "Hello"; s += ", World!"; // 上述代码实际是新建了一个包含“Hello, World!”的新字符串,并将引用指向它 ``` ### 2. **StringBuilder** - **可变性**:允许在其上进行多次追加或其他变更而不必每次都产生新的实例,效率较高。 - **非线程安全**:这意味着如果多个线程同时访问并尝试修改同一个 `StringBuilder` 实例,则可能会导致错误的结果或异常。 - **适合单线程环境下的大量字符串操作** #### 示例: ```java StringBuilder sb = new StringBuilder(); sb.append("Hello").append(", ").append("World!"); System.out.println(sb.toString()); // 输出: Hello, World! ``` ### 3. **StringBuffer** - **可变性**:同样支持高效的字符串构建和编辑功能。 - **线程安全**:所有的方法都是同步化的,即一次只允许一个线程执行这些方法,保证不会发生并发问题。但这通常会导致比 `StringBuilder` 更慢的速度。 - **适用于需要跨线程共享的情况** #### 示例: ```java StringBuffer sf = new StringBuffer(); sf.append("Hello").append(", ").append("World!"); System.out.println(sf.toString()); // 输出: Hello, World! ``` 综上所述,如果你的应用程序只需要在一个单独的线程中进行大量的字符串连接或者构造复杂的字符串表达式,那么建议使用 `StringBuilder` 来获得更好的性能;而当涉及到多线程环境下对同一字符串资源的竞争读写时,则应选用 `StringBuffer` 以确保安全性;至于普通的常量文本表示则推荐使用 `String`. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值