String、StringBuffer和StringBuilder类的区别
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技术干货!
▼微信扫一扫下图↓↓↓二维码关注
推荐阅读