三者的定义:
String:字符串常量,字符串String类代表字符串。 Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享。
StringBuffer 与 StringBuilder是字符缓冲变量。StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer中的方法大都采用了synchronized 关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。StringBuilder 是在JDK1.5才加入的。jdk的实现中StringBuffer与StringBuilder都继承自AbstractStringBuilder。
三者的区别:
(1)String类型的字符串对象是不可变的,一旦String对象创建后,包含在这个对象中的字符系列是不可以改变的,直到这个对象被销毁;
(2)StringBuilder和StringBuffer类型的字符串是可变的,不同的是StringBuffer类型的是线程安全的,而StringBuilder不是线程安全的;
(3)如果是多线程环境下涉及到共享变量的插入和删除操作,StringBuffer则是首选。如果是非多线程操作并且有大量的字符串拼接,插入,删除操作则StringBuilder是首选。毕竟String类是通过创建临时变量来实现字符串拼接的,耗内存还效率不高,怎么说StringBuilder是通过JNI方式实现终极操作的。
(4)StringBuilder和StringBuffer的“可变”特性总结如下:
1) append,insert,delete方法最根本上都是调用System.arraycopy()这个方法来达到目的;
2) substring(int, int)方法是通过重新new String(value, start, end - start)的方式来达到目的,因此,在执行substring操作时,StringBuilder和String基本上没什么区别;
3)三者在执行速度方面的比较:StringBuilder > StringBuffer > String。
a.相同点概述:
String,StringBuffer,StringBuilder最终底层存储与操作的都是char数组,StringBuffer和StringBuilder都继承了AbstractStringBuilder;
b.不同点概述:
String:char数组是final的,不可变,修改String时实际上是new一个新String对象返回,线程安全,频繁的增删操作时不建议使用;
StringBuffer:线程安全(StringBuffer中的方法中加synchronized锁),多线程建议使用这个,修改值时实际上是修改底层的char数组,相比String,开销更小;
StringBuilder:非线程安全的(StringBuilder中的方法中没加synchronized锁), 单线程使用这个更快,修改值时实际上是修改底层的char数组,相比String,开销更小。
三者的使用场景:
(1)使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算;
(2)使用StringBuffer类的场景:在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装;
(3)使用StringBuilder类的场景:在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。

被折叠的 条评论
为什么被折叠?



