关于字符串的拼接方式

1、加号

加号拼接字符串底层是调用StringBuilder来实现的,”a” + “b”等效于如下代码:

String a = "a";
StringBuilder ab= new StringBuilder();
ab.append(a).append("b");
String str = ab.toString();

但并不是说直接用加号拼接就可以达到StringBuilder的效率了,因为用加号每拼接一次都会新建一个StringBuilder对象,并且最后toString()方法还会生成一个String对象。在循环拼接十万次的时候,就会生成十万个StringBuilder对象,十万个String对象,效率不是很好。

2、concat拼接

查看底层源码,发现concat其实就是申请一个char类型的buf数组,将需要拼接的字符串都放在这个数组里,最后再转换成String对象。

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

3、StringBuilder/StringBuffer

通过调用父类AbstractStringBuilder的append方法来拼接字符串,StringBuffer的append方法加了sychronized关键字,因此线程是安全的,而StringBuilder线程是不安全的。

查看源码发现其主要原理也是利用char数组保存字符,通过ensureCapacityInternal方法来保证数组容量可用还有扩容。

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

猜你喜欢

转载自www.cnblogs.com/yamiya/p/12375353.html