测试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。

让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)

真的起飞在这里

    @Testpublic  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操作。如果你对性能有要求,而且可以使用,请这样用。

最后,祝大家早日学有所成,拿到满意offer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode --- Valid Parentheses

题目链接 Problem discription Given a string containing just the characters (, ), {, }, [ and ], determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and…

作息时间安排:

7&#xff1a;20起床7&#xff1a;30出发7&#xff1a;40早饭11&#xff1a;30-12&#xff1a;00午饭13&#xff1a;00-13&#xff1a;30午睡5&#xff1a;30-6&#xff1a;00 打水、 锻炼身体&#xff08;跑步到燕宏桥&#xff09;6&#xff1a;00-7&#xff1a;30 学习 英语、…

厉害了!这里藏着通关学霸的秘籍

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

学习了MPLS ×××

最近学习了一下MPLS 技术,确实蛮复杂的,而且觉得MPLS 技术主要是用在ISP以及厂商里面,是未来网络架构的一种主流技术,要完全掌握确实不是一件容易的事情,没法子,只能好好的先把理论学通了~加油加油~~TCP/IP路由技术我也还在看,全英文版,总体感觉英文版要比中文版容易理解的多了…

『 编程思维』之我见

编程思维&#xff0c;对于一个开发人员来说是必备的&#xff0c;但凡能让应用跑起来&#xff0c;不管应用的大小&#xff0c;优劣&#xff0c;说明这个开发人员都具有编程思维&#xff0c;毕竟程序认可了这个开发人员逻辑&#xff0c;能启动起来。小到几行代码&#xff0c;一个…

史上最全图详解Jvm—诊断工具和JVM监控

3.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 1&#xff0e;无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈至…

STL容器[10]

STL容器[0] 转载于:https://www.cnblogs.com/motadou/archive/2009/11/29/1613152.html

去医院看病如何开开心心出来? | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;图源百度弱智吧&#xff0c;侵权删&#xff09;

BF533和触摸屏接口芯片TSC2200调试日志

问了一下亿旗&#xff0c;终于调出来了&#xff0c;下面是部分源代码&#xff1a;//************************************************// //** file: spi.c //** target: ADSP-BF533 //** creat time: 2008-8-19 #include <ccblkfn.h> #include <cdefBF533.h> #in…

玩机器学习,能不知道它?

推荐一个端对端的开源机器学习平台编程导航 致力于推荐优质编程资源 ????项目开源仓库&#xff1a;https://github.com/liyupi/code-nav跪求一个 star ⭐️大家好&#xff0c;我是编程导航的小编 Made 。今天安利一个强大的开源机器学习平台—TensorFlow。TensorFlow 是一个…

js获取当前页面url网址等信息

使用js获取当前页面的url网址信息。 1、设置或获取整个 URL 为字符串&#xff1a; window.location.href 2、设置或获取与 URL 关联的端口号码&#xff1a; window.location.port 3、设置或获取 URL 的协议部分 window.location.protocol 4、&#xff08;www.jbxue.com&…

面试被问到Java 静态代理/动态代理?不用怕,这样子就可以!!

理解Java动态代理需要对Java的反射机制有一定了解 什么是代理模式# 在有些情况下&#xff0c;一个客户不能或者不想直接访问另一个对象&#xff0c;这时需要找一个中介帮忙完成某项任务&#xff0c;这个中介就是代理对象。 例如&#xff0c;购买火车票不一定要去火车站买&…

ASP.NET 视频截图功能的C#代码

前公司在制作播客系统(Web程序)中,用到从视频截图功能.下边是截图CatchImg方法,可从大多数的视频文件中截图成功,大家可测试;如果截图不成功,大多是因为视频本身的问题,如编码标准或加了密.但从在线录制的视频Flv文 前公司在制作播客系统(Web程序)中,用到从视频截图功能.下边是…

那些读了硕士博士的人,最不想让你知道的是什么?

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

ASP.NET中常用的26个优化性能方法

1. 数据库访问性能优化 数据库的连接和关闭访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证&#xff0c;比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户…

.NET Core 中有等价的 HttpContext.Response.Cache 吗?

咨询区 jackmusick&#xff1a;我想禁掉浏览器缓存&#xff0c;这样我的client端每次都能看到server端的最新内容&#xff0c;在 asp.net 时代可以这么写。public class NoCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingC…

java web程序 上机考试做一个登陆注册程序

大二期末 java web.用到数据库&#xff0c;jdbc.myeclipse实现用户的注册&#xff0c;登陆 并且不能出现500错误&#xff0c;用户不能重复注册。当用户任意点击时也不能出现500错误&#xff01; 这里。我只写注册成功的页面。这个不让用户重复注册 当时老师对我各种扣分。可后来…

Membership学习记录

Membership学习记录 ---自定义成员资格用户类型及相关提供程序一&#xff0e;Web.config文件配制 因Membership是基于Forms验证&#xff0c;所以首先得在<system.web>节点下添加Forms验证节点&#xff1a; <authentication mode"Forms"><forms name&q…

超详细图解!【MySQL进阶篇】MySQL事务和锁

ACID 特性 在关系型数据库管理系统中&#xff0c;一个逻辑工作单元要成为事务&#xff0c;必须满足这 4 个特性&#xff0c;即所谓的 ACID&#xff1a; 原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&am…

这道题号称无人能解!300多年来无一人答对,却让这群人这么简单就解出来了?...

全世界只有3.14 % 的人关注了青少年数学之旅最近&#xff0c;一条新闻引起了超模君的注意&#xff1a;“三体问题”或有解了&#xff01;这个蔑视了人类300多年的老顽固&#xff0c;真的要被彻底解决了吗&#xff1f;三体问题到底是什么&#xff1f;三体问题是说&#xff1a;三…