字符串拼接:String 的“+”、concat()方法 VS StringBuilder( or StringBuffer) 的append()方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/clover_lily/article/details/80658508
字符串拼接的三种方法:

① 加号 "+"
② concat()方法 

③ StringBuilder(或StringBuffer)的append()方法

一般来讲,拼接速度:

3>2>1

原因:

1、对+号来说

每趟循环都会创建一个StringBuilder对象 ;

每次执行完毕都会调用toString方法将其转换为字符串 。

不适用于循环操作。

String str = "My name is ";
str = str + "csdn";
  • 1
  • 2

相当于 str = new StringBuilder(str).append(“csdn”).toString(); 
语句执行完之后,总共有三个对象。

2、concat()方法 

concat源代码:

 public String concat(String str) {
        // 追加的字符串长度
        int otherLen = str.length();
        // 如果追加的字符串长度为0,则不做修改,直接返回原字符串
        if (otherLen == 0) {
            return this;
        }
        // 获取原字符串的字符数组value的长度
        int len = value.length;
        // 将原字符串的字符数组value放到buf字符数组中
        char buf[] = Arrays.copyOf(value, len + otherLen);
        // 将追加的字符串转化成字符数组,添加到buf中
        str.getChars(buf, len);
        // 产生一个新的字符串并返回
        return new String(buf, true);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

整体是一个数组的拷贝,虽然在内存中是处理都是原子性操作,速度非常快,但是,最后的return语句创建一个新String对象,也就是每次concat操作都会创建一个新的String对象,这也是限制concat方法速度的原因。

3、append()方法

append源代码:

public AbstractStringBuilder append(String str) {
        // 如果是null值,则把null作为字符串处理
        if (str == null)
            return appendNull();
        int len = str.length();
        // 追加后的字符数组长度是否超过当前值
        ensureCapacityInternal(count + len);
        // 字符串复制到目标数组
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
   private AbstractStringBuilder appendNull() {
        int c = count;
        ensureCapacityInternal(c + 4);
        final char[] value = this.value;
        value[c++] = 'n';
        value[c++] = 'u';
        value[c++] = 'l';
        value[c++] = 'l';
        count = c;
        return this;
    }
    private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        if (minimumCapacity - value.length > 0)
            expandCapacity(minimumCapacity);  // 加长,并作数组拷贝
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

整个append方法都在做字符数组的处理,加长,拷贝等,这些都是基本的数据处理,整个方法内并没有生成对象。只是最后toString返回一个对象而已。需要注意的是,append()方法返回的是一个StringBuilder(or StringBuffer)对象实例。

总结

大多数情况下,使用“+”即可满足需求,但是当在频繁进行字符串的运算(如拼接、替换、删除等),或者在系统性能临界的时候,我们可以考虑使用concat()或append()方法。

展开阅读全文

没有更多推荐了,返回首页