String、StringBuffer和StringBuilder类的区别

Java提供了String、StringBuffer和StringBuilder类来封装字符串,并提供了一系列操做字符串对象的方法。java

它们的相同点是都用来封装字符串;都实现了CharSequence接口。它们之间的区别以下:数组

1、可变与不可变安全

String类是一个不可变类,即建立String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。StringBuffer与StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变类。微信

因为String是可变类,适合在须要被共享的场合中使用,当一个字符串常常被修改时,最好使用StringBuffer实现。若是用String保存一个常常被修改的字符串,该字符串每次修改时都会建立新的无用的对象,这些无用的对象会被垃圾回收器回收,会影响程序的性能,不建议这么作。多线程

2、初始化方式app

当建立String对象时,能够利用构造方法String str = new String("Java")的方式来对其进行初始化,也能够直接用赋值的方式String s = "Java"来初始化。而StringBuffer只能使用构造方法StringBuffer sb = new StringBuffer("hello")的方式初始化。性能

3、字符串修改方式ui

String字符串修改方法是首先建立一个StringBuffer,其次调用StringBuffer的append方法,最后调用StringBuffer的toString()方法把结果返回,示例代码以下:
String str = "hello";spa

str += "java";线程

以上代码等价于下面的代码:

StringBuffer sb = new StringBuffer(str);

sb.append("java");

str = sb.toString();

上述String字符串的修改过程要比StringBuffer多一些额外操做,会增长一些临时的对象,从而致使程序的执行效率下降。StringBuffer和StringBuilder在修改字符串方面比String的性能要高。

4、是否实现了equals和hashCode方法

String实现了equals()方法和hashCode()方法,new String("java").equals(new String("java"))的结果为true;

而StringBuffer没有实现equals()方法和hashCode()方法,所以,new StringBuffer("java").equals(new StringBuffer("java"))的结果为false,将StringBuffer对象存储进Java集合类中会出现问题。

5、是否线程安全

StringBuffer与StringBuilder都提供了一系列插入、追加、改变字符串里的字符序列的方法,它们的用法基本相同,只是StringBuilder是线程不安全的,StringBuffer是线程安全的,。若是只是在单线程中使用字符串缓冲区,则StringBuilder的效率会高些,可是当多线程访问时,最好使用StringBuffer。

综上,在执行效率方面,StringBuilder最高,StringBuffer次之,String最低,对于这种状况,通常而言,若是要操做的数量比较小,应优先使用String类;若是是在单线程下操做大量数据,应优先使用StringBuilder类;若是是在多线程下操做大量数据,应优先使用StringBuffer类。

 

欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!

  ▼微信扫一扫下图↓↓↓二维码关注

 

相关文章
相关标签/搜索