码迷,mamicode.com
首页 > 其他好文 > 详细

关于字符串的拼接方式

时间:2020-02-28 01:15:21      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:bsp   getchar   concat   nal   length   abstract   扩容   this   转换   

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;
}

 

关于字符串的拼接方式

标签:bsp   getchar   concat   nal   length   abstract   扩容   this   转换   

原文地址:https://www.cnblogs.com/yamiya/p/12375353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!