String ,Stringbuffer ,StringBuilder;

突然看到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。所以创建一个对象。完成多次更改。当然超过指定长度的时候也会开辟一个新个内存空间。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值