字符串拼接、效率对比

字符串拼接,大多数时候都是直接选择+这种简单、暴力的方式,如果数据量感觉不到对性能影响有多大,实际在不同的场景,选择不同的拼接方式,还是很有必要的,而且+这种方式看着就很Low,是不是?

下面对几种字符串拼接做下对比:


第一种:+ 拼接int

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str + i;
}
long endTime = new Date().getTime();
System.out.println("采用+号拼接整数耗时:" + (endTime - startTime));

采用+号拼接整数耗时:9479    原因:需要把i先转成int 再转成Integter,再通过toString强转,然后采用StringBuilder拼接,会创建大量的StringBuilder对象

第二种:+拼接String
 

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str + “条”;
}
long endTime = new Date().getTime();
System.out.println("采用+号拼接字符串耗时:" + (endTime - startTime));

采用+号拼接字符串耗时:5063  和第一种相比,减去了i先转成int 再转成Integter,再通过toString强转,所以时间消耗少了很多

第三种:concat
 

String str = "拼接第";
long startTime = new Date().getTime();
for (int i = 0; i < 50000; i++) {
    str = str.concat(String.valueOf(i));
}
long endTime = new Date().getTime();
System.out.println("采用concat号拼接耗时:" + (endTime - startTime));

采用concat号拼接耗时:4010 ,内部会采用char数组的方式进行组合,然后通过new 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);
}

第四种:StringBuilder

String str = "拼接第";
StringBuilder stringBuilder = new StringBuilder();
long startTime = new Date().getTime();
for (int i = 0; i < 5000000; i++) {
    stringBuilder.append(i);
}
str = str + stringBuilder;
long endTime = new Date().getTime();
System.out.println("采用StringBuilder拼接耗时:" + (endTime - startTime));


采用StringBuilder号拼接耗时:535

 

第五中:StringBuffer

String str = "拼接第";
StringBuffer stringBuffer = new StringBuffer();
long startTime = new Date().getTime();
for (int i = 0; i < 5000000; i++) {
    stringBuffer.append(i);
}
str = str + stringBuffer;
long endTime = new Date().getTime();
System.out.println("采用StringBuffer拼接耗时:" + (endTime - startTime));

采用StringBuffer号拼接耗时:735

对比StringBuffer、StringBuilder

StringBuilder和StringBuffer在次数同为1万次的时候,两者差别不大,一旦扩充到几百万甚至几千万,那么StringBuilder明显比StringBuffer快了不少
经查看StringBuffer里面的append多了一个synchronized(同步)修饰符,所以,耗时长一点。也就是说StringBuffer在保证线程安全的情况下效率被降低了

所以,各位可以根绝不同的场景选择不同的拼接字符串的方式~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章