String,StringBuffer和StringBuilder的区别主要体现在工作效率和线程安全上:
1.工作效率:
String
说以下String最慢的原因,String创建的是字符串常量,而StringBuffer和StringBuilder创建的是字符串变量.
嗯...也就是说String一旦创建了对象就无法修改,代码说话
String s1="abc";
System.out.println(s1);
s1=s1+"def";
System.out.println(s1);
运行结果如下:
一看运行结果,不对啊!String类型的这不是可以修改的么?由"abc"被修改为"abcdef"了啊!
看起来好像是修改了,但其实s1已经"脱胎换骨"了.
其实在第三行代码中原始的s1,已经被JVM的垃圾回收机制给回收掉了,取而代之的是原来s1的值加上"def"的一个新的对象,这个对象也叫s1,所以说s1实际上没有被更改,我们眼中的更改不过是创建新对象和删除旧对象罢了,所以工作效率很慢.
相比较而言StringBuffer和StringBuilder修改变量就比较快了.
String s1 = "a" + "s";
StringBuilder s2 = new StringBuilder().append("a").append("s");
在此提示,有时候我们会像以上那样写代码,此时String就比StringBuilder快得多了
因为第一行的语句和String s1 = "as"是等价的,String直接创建了"as"对象,而StringBuilder,就先创建对象再修改,再修改......
2.线程安全:
StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
3.适用场景
大多数时候推荐使用StringBuilder.
以前在网上看过一篇帖子说,我们大多数时候基本上都是在用StringBuilder,而StringBuffer几乎没有使用场景,因为StringBuffer的线程安全,仅仅是保证jvm不抛出异常顺利的往下执行罢了,不保证逻辑正确和调用顺序正确,大多数时候,我们不仅仅需要线程安全,而是锁.
那为什么会有Stringbuffer的存在的呢?如果真的没有价值,为什么jdk会提供这个类?是因为最早是没有Stringbuilder的,只有StringBuffer,而一开始决定让Stringbuffer是线程安全的,这个决定似乎是不正确的,然后大约10年之后,人们终于意识到了,意识到在这10年之中这个愚蠢的决定为java运行速度慢这样的流言贡献了多大的力量,于是,在jdk1.5的时候,终于决定提供一个非线程安全的Stringbuffer实现,并命名为Stringbuilder.