欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

String、StringBuffer和StringBuilder类的区别

程序员文章站 2022-06-11 08:30:25
Java提供了String、StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法。 它们的相同点是都用来封装字符串;都实现了CharSequence接口。它们之间的区别如下: 一、可变与不可变 String类是一个不可变类,即创建String对象后, ......

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技术干货!

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

 String、StringBuffer和StringBuilder类的区别