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

懒的搞什么开头了,直接撸代码吧

想了想还是给大家看看学姐照片吧,保持眼睛的明亮,代码敲多了,伤眼

1: 作StringBuilder与String的拼接比较

1@Test 2public void testString () { 3 String s=""; 4 long begin = System.currentTimeMillis(); 5 for(int i=0; i<500000; i++){ 6 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 7 String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 8 String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 9 String s4 = s1+s2+s3; 10 } 11 long over = System.currentTimeMillis(); 12 System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 13} 14@Test 15public void testStringBuilder () { 16 StringBuilder sb = new StringBuilder(); 17 long begin = System.currentTimeMillis(); 18 for(int i=0; i<500000; i++){ 19 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 20 String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 21 String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 22 String s4= new StringBuilder(s1).append(s2).append(s3).toString(); 23 }//加入Java开发交流君样:756584822一起吹水聊天 24 long over = System.currentTimeMillis(); 25 System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 26}

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

testStringBuilder 改为

1StringBuilder 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: 多次拼接场景谁更优秀

1@Test 2public void testString () { 3 String s=""; 4 long begin = System.currentTimeMillis(); 5 for(int i=0; i<500000; i++){ 6 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 7 String s2 = s1 + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 8 String s3 = s2+ "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 9 } 10 long over = System.currentTimeMillis(); 11 System.out.println("操作"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 12} 13@Test 14public void testStringBuilder () { 15 StringBuilder sb = new StringBuilder(); 16 long begin = System.currentTimeMillis(); 17 for(int i=0; i<500000; i++){ 18 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 19 StringBuilder s4= new StringBuilder(s1); 20 String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 21 s4.append(s2); 22 String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 23 s4.append(s3); 24 // s4.append(UUIDUtil.uuid()); 25 } 26 long over = System.currentTimeMillis(); 27 System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 28}

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

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

让StringBuilder 更进一步

1@Test 2public void testStringBuilder () { 3 StringBuilder sb = new StringBuilder(); 4 long begin = System.currentTimeMillis(); 5 for(int i=0; i<500000; i++){ 6 StringBuilder s4= new StringBuilder(300); 7 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 8 s4.append(s1); 9 String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 10 s4.append(s2); 11 String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 12 s4.append(s3); 13 // s4.append(UUIDUtil.uuid()); 14 } 15 long over = System.currentTimeMillis(); 16 System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 17}

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

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

让StringBuilder能力起飞的操作

1@Test 2public void testStringBuilder () { 3 StringBuilder sb = new StringBuilder(); 4 long begin = System.currentTimeMillis(); 5 StringBuilder s4= new StringBuilder(300); 6 for(int i=0; i<500000; i++){ 7 s4.setLength(0); 8 String s1 = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY" ; 9 s4.append(s1); 10 String s2 = "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE" ; 11 s4.append(s2); 12 String s3 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ; 13 s4.append(s3); 14 // s4.append(UUIDUtil.uuid()); 15 }//加入Java开发交流君样:756584822一起吹水聊天 16 long over = System.currentTimeMillis(); 17 System.out.println("操作"+sb.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒"); 18}

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

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

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

真的起飞在这里

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

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

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )