• 关于String, StringBuilder,StringBuffer 的一些测试数据


    1:  作StringBuilder与String的拼接比较 

    @Test
    public void testString () {
    String s="";
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    String s4 = s1+s2+s3;
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }
    @Test
    public void testStringBuilder () {
    StringBuilder sb = new StringBuilder();
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    String s4= new StringBuilder(s1).append(s2).append(s3).toString();
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

    操作java.lang.StringBuilder类型使用的时间为:146毫秒
    操作java.lang.String类型使用的时间为:139毫秒

    将testStringBuilder  改为 

    StringBuilder s4= new StringBuilder(s1).append(s2).append(s3);

    操作java.lang.StringBuilder类型使用的时间为:110毫秒


    可以看出,直接使用 s1 的 + 运算,速度要快还要快些。不把StringBuilder转成String 时, 情况好一点。

    原因分析: 其实String的 + 本质上就是StringBuilder运算,估计JAVA还做了一些优化,导至速度比StringBuilder还快。

    得出结论是,多个变量一次性拼接的场景,直接使用 String + 速度不差,便如果有不需要转成String的话,StringBuilder还是优秀一些。

    StringBuilder连续多次不转》 String连接多次》 StringBuilder 连续多次转

    2: 多次拼接场景谁更优秀

    @Test
    public void testString () {
    String s="";
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    String s2 = s1 + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    String s3 = s2+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }
    @Test
    public void testStringBuilder () {
    StringBuilder sb = new StringBuilder();
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    StringBuilder s4= new StringBuilder(s1);
    String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    s4.append(s2);
    String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    s4.append(s3);
    // s4.append(UUIDUtil.uuid());
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

    操作java.lang.StringBuilder类型使用的时间为:110毫秒
    操作java.lang.String类型使用的时间为:205毫秒

    可以看出,如果是非连续的场景,StringBuilder性能已经远远的超过了String。


    3.1: 让StringBuilder 更进一步
    @Test
    public void testStringBuilder () {
    StringBuilder sb = new StringBuilder();
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    StringBuilder s4= new StringBuilder(300);
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    s4.append(s1);
    String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    s4.append(s2);
    String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    s4.append(s3);
    // s4.append(UUIDUtil.uuid());
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

    操作java.lang.StringBuilder类型使用的时间为:57毫秒 

    通过,预先设置StringBuilder的大小(前提是你要会预估), 可以再次提升StringBuilder能力。原因是StringBuilder放不下时,会扩容。

    3.2  让StringBuilder能力起飞的操作

    @Test
    public void testStringBuilder () {
    StringBuilder sb = new StringBuilder();
    long begin = System.currentTimeMillis();
    StringBuilder s4= new StringBuilder(300);
    for(int i=0; i<500000; i++){
    s4.setLength(0);
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ;
    s4.append(s1);
    String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ;
    s4.append(s2);
    String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
    s4.append(s3);
    // s4.append(UUIDUtil.uuid());
    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

    操作java.lang.StringBuilder类型使用的时间为:15毫秒

    在遇到字符串拼接性能要求高的场景,性能由高到低如下: 

    StringBuilder(内存复用 15mm) > StringBuilder(预先定义内存大小 57)> StringBuilder(拼接不转String 110) > String (连续拼接 139) > StringBuilder(拼接转String 146)

    4: 真的起飞在这里

        @Test
    public void testString () {
    String s="";
    long begin = System.currentTimeMillis();
    for(int i=0; i<500000; i++){
    String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" +
    "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" +
    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;

    }
    long over = System.currentTimeMillis();
    System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

    操作java.lang.String类型使用的时间为:0毫秒

    这个已经在编译时,已经合成一个String了,没有使用append操作。如果你对性能有要求,而且可以使用,请这样用。

  • 相关阅读:
    1.1. 哪一种 Python 适合您?
    使用自定义的 grafana插件
    ubuntu更换pip源
    安装gitlfs
    密钥配置
    java学习ArrayList集合讲解
    java学习Scanner常用类学习
    java学习猜数字游戏
    java学习匿名对象
    java学习一个标准类
  • 原文地址:https://www.cnblogs.com/liujianping/p/14793442.html
Copyright © 2020-2023  润新知