String、StringBuilder、StringBuffer的总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/May_3/article/details/79565642

写在前面:

    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。


猜你喜欢

转载自blog.csdn.net/May_3/article/details/79565642