您的位置:首页 > 产品设计 > UI/UE

String ,Stringbuffer ,StringBuilder;

2016-03-11 22:46 399 查看
突然看到StringBuffer有些忘记故写下来以便复习与更加理解。

String 首先不多解释 ,在下面解释;

StringBuffer是线程安全的,可以适用于多线程更改字符串内容。效率比StringBuilder低需要维护锁;

StringBuilder是线程不安全的,但是效率高,常用语单线程修改字符串内容;

首先说明StringBuffer与StringBuilder的区别;我们看源码:

StringBuffer的源码



public synchronized void setCharAt(int index, char ch) {
if ((index < 0) || (index >= count))
throw new StringIndexOutOfBoundsException(index);
value[index] = ch;
}

/**
* @see     java.lang.String#valueOf(java.lang.Object)
* @see     #append(java.lang.String)
*/
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}

public synchronized StringBuffer append(String str) {
super.append(str);
return this;
随便复制了内部源码观看基本上每个方法都加了同步synchronized判断。所以相对效率就低了。但是线程安全了。

看StringBuilder源码

public StringBuilder append(String str) {
super.append(str);
return this;
}

// Appends the specified string builder to this sequence.
private StringBuilder append(StringBuilder sb) {
if (sb == null)
return append("null");
int len = sb.length();
int newcount = count + len;
if (newcount > value.length)
expandCapacity(newcount);
sb.getChars(0, len, value, count);
count = newcount;
return this;
}


同样随便复制,都没有加同步方法锁。

总结:但是这两个类都是 AbstractStringBuilder的子类且算法基本相同。所以使用其中之一取决于你当前是否为多线程处理,

最后取到StringBuffer与StringBuilder的其一,我们与String就做比较;

(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,需要重复创建销毁对象。

       但是StringBuffer类对象为可修改对象,可以通过append()方法来修改值

做个实例
String str1="abc";
String str2="efg";
String str3 =str1+str2;
System.out.println("str3地址:"+str3.hashCode());
//HashCode是判断识别是否为一个对象值不相等说明不是一个对象。
str3 =str1+str3+str2;
System.out.println("str3地址:"+str3.hashCode());

StringBuffer strB1=new StringBuffer("abc");
StringBuffer strB2=new StringBuffer("efg");
StringBuffer strB3=strB1.append(strB2);
System.out.println("strB3地址:"+strB3.hashCode());
strB3=strB3.append(strB3);
System.out.println("strB3地址:"+strB3.hashCode());


:最后打印的值为

str3地址:-1424384956

str3地址:2073307904

strB3地址:1743911840

strB3地址:1743911840

修改str3的值等于是又创建了一个新的对象。Hashcode值更改。

而StrB3更改不会去创建新的对象

所以去修改String类对象的性能远不如StringBuffer类。所以这也是StringBuffer类编写的意义为了解决String这一弊端。

再看源码:String是final 的不可更改的,每次改动都是要创建新的对象。StringBuffer虽然是String 类型。但是初始化的 时候调用的是默认16个长度的char类型。最后才调用tostring。所以创建一个对象。完成多次更改。当然超过指定长度的时候也会开辟一个新个内存空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: