java中拼接字符串的5种方法效率对比
前言
最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,所以下面就来测试下面,话不多说了,来一起看看详细的介绍吧。
示例代码
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(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(System.currentTimeMillis() - startTime); } @org.junit.Test public void test4() { long startTime = System.currentTimeMillis(); StringUtils.join(list); System.out.println(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(System.currentTimeMillis() - startTime); } }
第一种:33809
第二种:8851
第三种:6
第四种:12
第五种:7
性能:StringBuilder>StringBuffer>StringUtils.join>concat>+
然后从源码层面分析下
StringBuilder:
每次字符串拼接都只是扩展内部char数组,只生产一个最终的string,所以这种效率最高
StringBuffer:
与StringBuilder相比只是多加了个synchronized,所以在单线程的情况下相差不大
StringUtils.join:
可以看到其内部还是用StringBuilder实现,但是每次循环都多了个分隔符的判断所以慢了一点,但是也不多,时间上来讲是一个数量级的
concat:
可以看出每次连接都会生成一个string,所以效率很低
+:
因为是重载的运算符,找不到源码,但是从结果来看效率最低
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
相关文章
Java输出通过InetAddress获得的IP地址数组详细解析
由于byte被认为是unsigned byte,所以最高位的1将会被解释为符号位,另外Java中存储是按照补码存储,所以1000 0111会被认为是补码形式,转换成原码便是1111 0001,转换成十进制数便是-1212013-09-09Java中==运算符与equals方法的区别及intern方法详解
这篇文章主要介绍了Java中==运算符与equals方法的区别及intern方法详解的相关资料,需要的朋友可以参考下2017-04-04SpringBoot如何使用feign实现远程接口调用和错误熔断
这篇文章主要介绍了SpringBoot如何使用feign实现远程接口调用和错误熔断,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-12-12Java中的Random和ThreadLocalRandom详细解析
这篇文章主要介绍了Java中的Random和ThreadLocalRandom详细解析,Random 类用于生成伪随机数的流, 该类使用48位种子,其使用线性同余公式进行修改,需要的朋友可以参考下2024-01-01线程池之newFixedThreadPool定长线程池的实例
这篇文章主要介绍了线程池之newFixedThreadPool定长线程池的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-06-06
最新评论