浅谈Java String,StringBuffer,StringBuilder

String的定义:

String类型的数据就是一系列char类型的组合,它属于引用类型。它的特点在于

  • 它是不可以改变的
  • JVM会在“字符串常量池”中创建字符串,并让对象指向该字符串,这样的做法就是为了提高程序执行的效率,当要调用的时候就直接去常量池中寻找,而不是创建一个新的对象在堆中。
  • String 不适合做频繁的字符串拼接工作,这样会在“字符串常量池”中创建大量的字符串,给垃圾收集带来了很大的麻烦

StringBuffer,StringBuilder

工作原理:

预先在内存中申请一块固定大小的空间,容纳字符串序列,如果空间不足,则自动扩容。

 public StringBuffer(String str) {
        super(str.length() + 16);  //当序列快满了,增加16个char类型的空间
        append(str);
    }
// append的工作原理
// private transient char[] toStringCache;
// synchronized buffer 是多线程安全的
@Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null; // toStringCache 是一个c数组
        super.append(str);
        return this;
    }

默认容量:

public StringBuffer() {
        super(16);
    }

StringBuffer提供的方法

StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。

StringBuffer 与 StringBuilder的区别

// StringBuilder的append方法源码
    @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

可以看到StringBuilder是线程不安全的。所以效率会比Buffer更高,同样适合扩容,修改频繁的

优化

StringBuffer与StringBuilder默认容量和扩容大小都是16位char类型的数据,如果能提前预知要插入的String的大小,手动修改扩容的大小,能减少底层的拷贝,提高效率。

# Java 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×