引言
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的值
对比
指标 | String | StringBuffer | StringBuilder |
---|---|---|---|
存储地 | 字符串池 | 堆 | 堆 |
是否可变 | 不可变 | 可变 | 可变 |
线程是否安全 | 线程安全 | 线程安全 | 线程不安全 |
速度表现 | 快 | 较慢 | 快 |