String 同StringBuffer性能比较

String和StringBuffer都可以用来拼接字符串,但大多数java程序员都知道。String拼接的性能远不及StringBuffer或者StringBuilder,为什么?

一,StringBuffer性能更好的原因

首先,String和StringBuffer对字符串的内部存放都是放在char数组中,但有细微差别。

String的拼接实现

String的数组声明为:

 private final char value[];

由于String的char数组是final声明,这意味一旦存放具体内容后,char[]将无法改变,于是String在做拼接时,就有了如下代码:

    public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        char buf[] = new char[count + otherLen];
        getChars(0, count, buf, 0);
        str.getChars(0, otherLen, buf, count);
        return new String(0, count + otherLen, buf);
    }

可以看到,拼接时,新创建一个char数组buf,然后将新老字符串全部拷贝到新buf中,在用String的构造方法基于buf创建一个全新的String对象。

StringBuffer的实现

StringBuffer继承至AbstractStringBuilder,其存放数组声明为:

char value[];

代码实现为:

    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
            int len = str.length();
        if (len == 0) return this;
        int newCount = count + len;
        if (newCount > value.length)
            expandCapacity(newCount);
        str.getChars(0, len, value, count);
        count = newCount;
        return this;
    }

可以看到,拼接时,是将拼接的字符串直接拼接至value中,容量不足则扩容,没有新建字符串。

二,结论

由于String拼接时都要重新创建一个字符串,所以其性能较差。StringBuilder和StringBuffer原理类似,只是StringBuilder非线程安全而已,不在赘述。