Java提供了String,StringBuffr,StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法.
他们的相同点都是封装字符串;都实现了CharSeqence接口.
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable,CharSequnce
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable,CharSeqence
他们之间的区别如下:
- 可变与不可变
String类是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁.StringBuffer与StringBuilder都继承自AbstractStringBudiler类,在AbstractBuilder中也是使用字符数组保存字符串,是可变类.
由于String是可变类,适合在需要被共享的场合中是使用,当一个字符串经常被修改时,最好使用Stringbuffer实现.如果用String保存一个经常被修改的字符串,该字符串每次修改时都会创建新的无用的对象,这些无用的对象会被垃圾回收器回收,会影响程序的性能.
- 初始化方法
当创建String对象时,可以利用构造方法String str = new String(“Java”)的方式来对其进行初始化,也可以直接用赋值的方式String s= “Java”来初始化.二StringBuffer只能使用构造方式StringBuffer sb = new StringBuffer(“hello”)的方式初始化.
- 字符串修改方式
String字符串修改方法是首先创建一个StringBuffer,其次调用StringBuffer的append方法,最后调用StringBuffer的toString()方法把结果返回.
- 是否实现了equals和hashCode方法
String实现了equals()方法和hashCode()方法,而StringBuffer没有实现equals()方法和hashCode()方法
- 是否线程安全
StringBuffer与StringBuilder都提供了一系列插入,追加,改变字符串里的字符序列的方法,他们的用法基本相同,知识StringBuilder是线程不安全的,StringBuffer是线程安全的,如果只是在单线程中使用字符串缓冲区,则StringBuilder的效率会高些,但是当多线程访问时,最好使用StringBuffer.
综上所述,在执行效率方面,StringBuilder最高,StringBuffer次之,String最低,对于这种情况,一般而言,如果要操作的数量比较小,应优先使用String类;如果是在单线程下操作大量数据,应优先使用StringBuilder类;如果是在多线程下操作大量数据,应优先使用StringBuffer类.