示例代码:
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
/**
* @author : Jzm
* @Date : Created on 2019/6/12.
*/
public class Test {
List<String> list = new ArrayList<>();
@Before
public void init(){
IntStream.range(0, 100000).forEach((index) -> {
list.add("str" + index);
});
}
@org.junit.Test
public void test1() {
String ss = "";
long startTime = System.currentTimeMillis();
for (String s : list) {
ss += s;
}
System.out.println("+:"+(System.currentTimeMillis() - startTime));
}
@org.junit.Test
public void test2() {
String ss = "";
long startTime = System.currentTimeMillis();
for (String s : list) {
ss=ss.concat(s);
}
System.out.println("concat:"+(System.currentTimeMillis() - startTime));
}
@org.junit.Test
public void test3() {
StringBuilder ss = new StringBuilder();
long startTime = System.currentTimeMillis();
for (String s : list) {
ss.append(s);
}
System.out.println("concat:"+(System.currentTimeMillis() - startTime));
}
@org.junit.Test
public void test4() {
long startTime = System.currentTimeMillis();
StringUtils.join(list);
System.out.println("join:"+(System.currentTimeMillis() - startTime));
}
@org.junit.Test
public void test5() {
StringBuffer ss = new StringBuffer();
long startTime = System.currentTimeMillis();
for (String s : list) {
ss.append(s);
}
System.out.println("StringBuffer:"+(System.currentTimeMillis() - startTime));
}
}
执行结果:
+:102525
concat:24605
StringBuilder:17
join:36
StringBuffer:22
分析:
时间角度:
StringBuilder < StringBuffer < join < concat < +
源码角度:
StringBuilder
每次的字符串拼接是在对内部char做扩充,最终只生成一个String。
StringBuffer
StringBuffer与StringBuilder 底层调用一样,差别在关键字,若是单线程状态下差别不大。
join
join 底层 调用StringBuilder ,多了些判断虽然是慢些,但总归是同一数量级。
concat
每次拼接都会产生一个新的String对象,所以效率会有所降低。
“+”
连接符,因找不到源码只能从时间维度分析。