Java提供了String、StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法。
它们的相同点是都用来封装字符串;都实现了CharSequence
接口。它们之间的区别如下:
一、可变与不可变
String类是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。StringBuffer与StringBuilder都继承自AbstractStringBuilder
类,在AbstractStringBuilder
中也是使用字符数组保存字符串,是可变类。
由于String是可变类,适合在需要被共享的场合中使用,当一个字符串经常被修改时,最好使用StringBuffer实现。如果用String保存一个经常被修改的字符串,该字符串每次修改时都会创建新的无用的对象,这些无用的对象会被垃圾回收器回收,会影响程序的性能,不建议这么做。
二、初始化方式
当创建String对象时,可以利用构造方法String str = new String("demo")
的方式来对其进行初始化,也可以直接用赋值的方式String s = "demo"
来初始化。而StringBuffer
只能使用构造方法StringBuffer sb = new StringBuffer("hello world")
的方式初始化。
三、字符串修改方式
String字符串修改方法是首先创建一个StringBuffer
,其次调用StringBuffer
的append方法,最后调用StringBuffer的toString()方法把结果返回,示例代码如下:
javascript">String cat = "miaomiao";
cat+= "demo";
以上代码等价于下面的代码:
javascript">StringBuffer dog = new StringBuffer(cat);
dog.append("demo01");
cat = dog .toString();
上述String字符串的修改过程要比StringBuffer
多一些额外操作,会增加一些临时的对象,从而导致程序的执行效率降低。stringBuffer
和StringBuilder
在修改字符串方面比String的性能要高。
四、是否实现了equals和hashCode方法
String实现了equals()
方法和hashCode()
方法。
而StringBuffer没有实现equals()
方法和hashCode()
方法,将StringBuffer对象存储进Java集合类中会出现问题。
五、是否线程安全
StringBuffer与StringBuilder都提供了一系列插入、追加、改变字符串里的字符序列的方法,它们的用法基本相同,只是StringBuilder是线程不安全的,StringBuffer是线程安全的。如果只是在单线程中使用字符串缓冲区,则StringBuilder的效率会高些,但是当多线程访问时,最好使用StringBuffer。
综上,在执行效率方面,StringBuilder最高,StringBuffer次之,String最低。总的来说,如果要操作的数量比较小,先使用String类;如果是在单线程下操作大量数据,先使用StringBuilder类;如果是在多线程下操作大量数据,先使用StringBuilder类。