String、StringBuilder、StringBuffer的总结

写在前面:

    String、StringBuilder、StringBuffer都是Java用于定义一个字符串,三者看着相似,但在效率,线程安全方面有着区别。这篇博客就进行一些总结。

    String:

    String大概是我们学习Java SE最先接触到的一个关键字了,String是字符串常量,String对象一旦创建之后,不会改变。

package string;

public class StringDemo {

	public static void main(String[] args) {
		String arr = "abc";
		arr = arr + "def";
		System.out.println(arr);
	}

}

在这段代码中,我们可以看出,arr初始化为“abc”,又拼接上“def”,事实上String对象的确没有改变,在拼接“def”的时候,是又创建了一个String对象,arr指向了新的引用地址。(参考之前的博客:http://blog.csdn.net/may_3/article/details/79125706

StringBuilder:

    StringBuilder是可变类,StringBuilder的构造方法,默认会构建长度为16的数组空间,如果初始化的字符串长度>16,则会扩容。

   public StringBuilder() {
        super(16);
    }

扩容方法的源码在StringBuilder的父类-AbstractStringBuilder如下:

    public void ensureCapacity(int minimumCapacity) {
        if (minimumCapacity > 0)
            ensureCapacityInternal(minimumCapacity);
    }

    但StringBuilder是不保证同步的,且不像String每次修改,就会重写创建对象,所以运行效率很快。

StringBuffer:

    首先StringBuffer是线程安全的,StringBuffer的append方法都是由synchronized修饰。

    @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }
    这样做保证了StringBuffer类在多线程并发修改字符串时候,保证了字符串的修改安全。但是效率会低于StringBuilder。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值