当前位置: 移动技术网 > IT编程>开发语言>Java > String、StringBuffer和StringBuilder类的区别

String、StringBuffer和StringBuilder类的区别

2019年03月03日  | 移动技术网IT编程  | 我要评论

java提供了string、stringbuffer和stringbuilder类来封装字符串,并提供了一系列操作字符串对象的方法。

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

一、可变与不可变

string类是一个不可变类,即创建string对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。stringbuffer与stringbuilder都继承自abstractstringbuilder类,在abstractstringbuilder中也是使用字符数组保存字符串,是可变类。

由于string是可变类,适合在需要被共享的场合中使用,当一个字符串经常被修改时,最好使用stringbuffer实现。如果用string保存一个经常被修改的字符串,该字符串每次修改时都会创建新的无用的对象,这些无用的对象会被垃圾回收器回收,会影响程序的性能,不建议这么做。

二、初始化方式

当创建string对象时,可以利用构造方法string str = new string("java")的方式来对其进行初始化,也可以直接用赋值的方式string s = "java"来初始化。而stringbuffer只能使用构造方法stringbuffer sb = new stringbuffer("hello")的方式初始化。

三、字符串修改方式

string字符串修改方法是首先创建一个stringbuffer,其次调用stringbuffer的append方法,最后调用stringbuffer的tostring()方法把结果返回,示例代码如下:
string str = "hello";

str += "java";

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

stringbuffer sb = new stringbuffer(str);

sb.append("java");

str = sb.tostring();

上述string字符串的修改过程要比stringbuffer多一些额外操作,会增加一些临时的对象,从而导致程序的执行效率降低。stringbuffer和stringbuilder在修改字符串方面比string的性能要高。

四、是否实现了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集合类中会出现问题。

五、是否线程安全

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

综上,在执行效率方面,stringbuilder最高,stringbuffer次之,string最低,对于这种情况,一般而言,如果要操作的数量比较小,应优先使用string类;如果是在单线程下操作大量数据,应优先使用stringbuilder类;如果是在多线程下操作大量数据,应优先使用stringbuilder类。

 

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

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

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网