- String 为字符串常量,StringBuffer、StringBuilder为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。(他们三个都是不可变类)
//代码来自JDK源码
//String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
//JDK中StringBuffer和StringBuilder都继承AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
}
- 速度String<StringBuffer<StringBuilder
以下代码为例说明String字符串相加的JVM处理,进而说明其速度为什么慢。
运行以下代码先输出abc后输出abcde,好像str被更改了,其实jvm在处理的时候是又实例化一个String对象然后把abcde放进新的对象,然后把str指向新的对象,最后把原来的存放abc的对象空间释放。
而StringBuffer和StringBuilder在对字符串修改时不需要另外再实例化对象,所以他们来个速度比String快。但是StringBuilder为啥比StringBuffer快呢 ?继续往下看
String str="abc";
System.out.println(str);
str=str+"de";
System.out.println(str);
- StringBuffer线程安全,StringBuilder线程不安全
由JDK源码可知StringBuffer方法有synchronized关键词修饰 是线程安全的。
StringBuilder 没有加锁所以是线程不安全的。
由于StringBuffer加锁开销导致他的速度比StringBuilder慢。
//StringBuffer
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
//StringBuilder
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
转载于:https://www.cnblogs.com/jiaorenzhan/p/10623948.html
原文链接:https://blog.csdn.net/weixin_30342827/article/details/95418291
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
还没有人抢沙发呢~