测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~

Posted Java架构没有996

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试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();
    }//加入Java开发交流君样:756584822一起吹水聊天
    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。

让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放不下时,会扩容。

让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());
    }//加入Java开发交流君样:756584822一起吹水聊天
    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)

真的起飞在这里

    @Test
    public  void testString () {
        String s="";
        long begin = System.currentTimeMillis();
        for(int i=0; i<500000; i++){
            String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" +
            "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" +
                    "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
                     //加入Java开发交流君样:756584822一起吹水聊天
        }
        long over = System.currentTimeMillis();
        System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
    }

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

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

最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

可以的话请给我一个三连支持一下我哟???【获取资料】

以上是关于测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~的主要内容,如果未能解决你的问题,请参考以下文章

String,StringBuffer,StringBuilder的区别

StringBuffer与StringBuilder异同对比分析

测试String, StringBuilder,StringBuffer 的数据,我居然发现这些了~~

String和StingBuffer,StringBuffer和Stringbuilder的区别

String,StringBuilder,StringBuffer三者的区别

String 与 StringBuilder 区别与用法