zoukankan      html  css  js  c++  java
  • 字符串拼接的几种方式--性能问题

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 import org.apache.commons.lang.StringUtils;
     4 import org.junit.Test;
     5 import org.slf4j.Logger;
     6 import org.slf4j.LoggerFactory;
     7 public class TestString {
     8     private final Logger logger = LoggerFactory.getLogger(this.getClass());
     9     @Test
    10     public void testPlus() {
    11         String s = "";
    12         long ts = System.currentTimeMillis();
    13         for (int i = 0; i < 10000; i++) {
    14             s = s + String.valueOf(i);
    15         }
    16         long te = System.currentTimeMillis();
    17         logger.info("+ cost {} ms", te - ts);
    18     }
    19     @Test
    20     public void testConcat() {
    21         String s = "";
    22         long ts = System.currentTimeMillis();
    23         for (int i = 0; i < 10000; i++) {
    24             s = s.concat(String.valueOf(i));
    25         }
    26         long te = System.currentTimeMillis();
    27         logger.info("concat cost {} ms", te - ts);
    28     }
    29     @Test
    30     public void testJoin() {
    31         List<String> list = new ArrayList<String>();
    32         long ts = System.currentTimeMillis();
    33         for (int i = 0; i < 10000; i++) {
    34             list.add(String.valueOf(i));
    35         }
    36         StringUtils.join(list, "");
    37         long te = System.currentTimeMillis();
    38         logger.info("StringUtils.join cost {} ms", te - ts);
    39     }
    40     @Test
    41     public void testStringBuffer() {
    42         StringBuffer sb = new StringBuffer();
    43         long ts = System.currentTimeMillis();
    44         for (int i = 0; i < 10000; i++) {
    45             sb.append(String.valueOf(i));
    46         }
    47         sb.toString();
    48         long te = System.currentTimeMillis();
    49         logger.info("StringBuffer cost {} ms", te - ts);
    50     }
    51     @Test
    52     public void testStringBuilder() {
    53         StringBuilder sb = new StringBuilder();
    54         long ts = System.currentTimeMillis();
    55         for (int i = 0; i < 100000; i++) {
    56             sb.append(String.valueOf(i));
    57         }
    58         sb.toString();
    59         long te = System.currentTimeMillis();
    60         logger.info("StringBuilder cost {} ms", te - ts);
    61     }
    62 }

    运行结果如下:
    11:00:22,359 INFO TestString:23 - + cost 1828 ms
    11:00:22,921 INFO TestString:34 - concat cost 562 ms
    11:00:22,937 INFO TestString:46 - StringUtils.join cost 16 ms
    11:00:22,968 INFO TestString:58 - StringBuffer cost 31 ms
    11:00:23,031 INFO TestString:70 - StringBuilder cost 63 ms


    要特别注意的是:
    StringBuilder 循环的次数是其它的10倍,如果是一样,那么返回 0,可见StringBuilder 的速度之快。

    总结:
    用+的方式效率最差,concat由于是内部机制实现,比+的方式好了不少。
    Join 和 StringBuffer,相差不大,Join方式要快些,可见这种JavaScript中快速拼接字符串的方式在Java中也非常适用。
    StringBuilder 的速度最快,但其有线程安全的问题,而且只有JDK5支持。

  • 相关阅读:
    Eclipse集成Maven的Web工程demo(独立及Maven集成tomcat)
    Spring Boot的常见配置项解析
    SpringBoot入门demo
    简单句障碍的解决
    阅读理解(2000年统考)
    Java Web项目实战第1篇之环境搭建
    [STM32F10x] 利用定时器测量脉冲宽度
    [STM32F10x] 利用定时器测量频率
    STM32 输入捕获的脉冲宽度及频率计算
    RT-Thread—STM32—在线升级(Ymodem_OTA、HTTP_OTA)
  • 原文地址:https://www.cnblogs.com/yadongliang/p/5484416.html
Copyright © 2011-2022 走看看