在系统性能优化的时候循环和字符串处理一直是非常值得注意的地方。从心态上我们一定不能把自己的眼界放在十次或者是百次循环的层次上,也不能把自己要处理的字符串当做是有十个二十个字符。每次遇到循环都要假定这个循环是上万次的,每次要处理的字符串的时候一定要告诉自己这个字符串将来有可能是很大的。不要等到数据量真的达到十万、百万的级别之后再采取处理,那样的话成本的消耗就太大了。本文将介绍关于Java代码中循环和字符串的优化方法,希望对读者有用。

关于循环

嵌套for循环中次数多的放在内侧,次数少的放在外侧。众所周知for循环需要定义一个循环变量来遍历每一个需要循环的对象,那么如果循环次数多的循环放在外侧那么无疑将会使得总体的变量增多,效率自然会降低。下面进行代码测试

public class Test{public static void main (String [] args){Long time2Before=System.nanoTime();for (int i=0; i<10;i++ ){ for (int j=0; j<1000000;j++ ){ }}Long time2After=System.nanoTime();System.out.println("faster--->"+(time2After-time2Before));Long time1Before=System.nanoTime();for (int i=0; i<1000000;i++ ){ for (int j=0; j<10;j++ ){ }}Long time1After=System.nanoTime();System.out.println("slower--->"+(time1After-time1Before));}
}

在循环中只做与循环相关的事情,一些不必要的循环不要放到循环当中去做。比如在遍历集合的时候没有必要将取得集合大小放在循环中去做,完全可以放在集合的外边。效果上没区别,性能上差距巨大。

import java.util.*;
public class Test1{public static void main (String [] args){List<String> list=new ArrayList<String>();for(int i=0;i<1000000;i++){list.add("luck"+i);}Long time1Before=System.nanoTime();for(int i=0;i<list.size();i++){//  System.out.println(list.get(i));}Long time1After=System.nanoTime();System.out.println("use .size-->"+(time1After-time1Before));Long time2Before=System.nanoTime();int n=list.size();for(int i=0;i<n;i++){//  System.out.println(list.get(i));}Long time2After=System.nanoTime();System.out.println("do not use .size-->"+(time2After-time2Before));}
}

关于字符串

消除字符串连接,在程序中优先考虑使用StringBuffer或者StringBuilder代替String。一个字符串相当于一个匿名的String对象,如果在程序中拼接两个字符串那么会在内存中定义三个字符串空间。而StringBuffer或者StringBuilder就不会这么做,而是在原来已有的StringBuffer或者StringBuilder对象中进行修改。测试代码如下

public class Test3{public static void main (String [] args){long time1Before=System.nanoTime();String str="";for(int i=0;i<10000;i++){str+=i;}long time1After=System.nanoTime();System.out.println("use String --->  "+(time1After-time1Before));long time2Before=System.nanoTime();StringBuilder sbuilder=new StringBuilder();for(int i=0;i<10000;i++){sbuilder.append(i);}long time2After=System.nanoTime();System.out.println("use StringBuilder--->  "+(time2After-time2Before));long time3Before=System.nanoTime();StringBuffer stringBuffer=new StringBuffer();for(int i=0;i<10000;i++){stringBuffer.append(i);}long time3After=System.nanoTime();System.out.println("use StringBuffer--->  "+(time3After-time3Before));}
}

需要说明的是在StringBuffer和StringBuilder之间如果需要考虑选其一的话原则很简单,前者是线程安全的后者是线程不安全的,换句话说后者比前者更快。综上所述如果单单从性能上考虑的话从高到低依次是:StringBuilder --> StringBuffer --> String。

循环和字符串是程序中最容易提升代码效率的地方,因为很多人在写程序的时候为了图一时方便将效率抛在脑后,当要处理的数据不大的时候无所谓,一旦程序要处理的数据增大那么性能的瓶颈也就出现了。所以就像文章开头所说的,要在写程序的时候就要考虑十万百万的数量级,不要等到性能瓶颈出现再去解决,因为代码重构或者说后期的优化成本要远远高于前期的开发成本,相信看过别人无注释而又冗长代码的童鞋深有体会(窃笑~~)。

系统性能调优(5)----Java循环与字符串代码优化相关推荐

  1. 原理剖析(第 013 篇)应用系统性能调优

    原理剖析(第 013 篇)应用系统性能调优 - 一.大致介绍 1. 本人接手的一个打车系统,因为出现了一次响应十分缓慢的情况,因此才有了应用调优的篇章: 2.由于过程中可能没有阐述的太清楚,如想详细了 ...

  2. Android系统性能调优工具介绍

    经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评 ...

  3. JVM调优系列--Java命令选项(参数)--大全/详解/常用

    原文网址:JVM调优系列--Java命令选项(参数)--大全/详解/常用_IT利刃出鞘的博客-CSDN博客 简介 说明        本文介绍Java的java命令用法,包括:常用用法.选项大全. J ...

  4. java jvm调优_(第2部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

    java jvm调优 这是以前的文章(第3部分,共1部分)的继续:有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的提要 . 事不宜迟,让我们开始使用我们的 ...

  5. (第2部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

    这是以前的文章(第3部分,共1部分)的继续:有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的提要 . 事不宜迟,让我们开始使用我们的下一组博客和视频,印章 ...

  6. Perf -- Linux下的系统性能调优工具,第 2 部分

    https://www.ibm.com/developerworks/cn/linux/l-cn-perf2/ Perf -- Linux下的系统性能调优工具,第 2 部分 刘 明, 软件工程师, 上 ...

  7. 系统性能调优必知必会(脑图更新。。)

    系统性能调优必知必会 CPU缓存 CPU多级缓存,单核心会有自己的一级二级缓存,所有核心会共享三级缓存 一级缓存包括数据缓存 .指令缓存. 数据的读取是以缓存行进行读取的,缓存行一般为64字节. 缓存 ...

  8. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化Ap ...

  9. java jvm调优_(第1部分,共3部分):有关性能调优,Java中的JVM,GC,Mechanical Sympathy等的文章和视频的摘要...

    java jvm调优 我已经花了几个月的时间考虑审查有关性能调优,JVM,Java中的GC,Mechanical Sympathy等主题的文章和视频的缓存,并最终花了点时间–也许这就是重点我什么时候才 ...

最新文章

  1. matlab图像中心坐标的确定,已知散点图中各点的坐标,如何确定散点图的中心点坐标?Matlab? 爱问知识人...
  2. 短信验证码、图形验证码、邮件验证的自动化测试
  3. 网络安全-windows批处理
  4. JSON 序列化与反序列化:使用TypeReference 构建类型安全的异构容器
  5. 2019蓝桥杯省赛---java---B---4(数的分解)
  6. SQL Server中的假期表和GetWorkDays函数
  7. 回溯法解决0-1背包问题
  8. 《统计学习方法》代码全解析——第四部分朴素贝叶斯
  9. mysqlL时间戳和时间的获取/相互转换/格式化
  10. shl归纳推理测试题库_强生2020秋招笔试面试经验合集
  11. 三星note8android 9.0,三星S9/S9+计划明天推送安卓9.0正式版、S8/S8+、Note8下周推测试版...
  12. (转,感谢原作者!)既然选择了Linux,有何必在乎这些——Linux wine国服LOL英雄联盟,完美运行!!...
  13. 网络安全实验室 脚本关 10
  14. 1024程序员节节日快乐
  15. Scrapy 抓取 当当图书2018畅销榜的所有图书
  16. 麦吉尔大学计算机科学申请,三大权威榜单为你诠释:加拿大计算机科学哪家强?...
  17. 见丰知夏|国漫鼻祖丰子恺,数字藏品独家发售
  18. 英语中what的用法
  19. 今年这情况。。咱还是留个心眼吧
  20. mysql id不重复随机码_MySQL 随机不重复ID,该怎么处理

热门文章

  1. VTK:网格之FitToHeightMap
  2. Qt Creator指定编辑器设置
  3. C言语实现midpoint euler中点欧拉法解常微分方程(附完整源码)
  4. C语言实现二叉树(附完整源码)
  5. c++ vector方法
  6. QT实现在图表顶部绘制一个附加元素(标注)
  7. STL算法中函数对象和谓词
  8. dev多行注释_Dev使用技巧
  9. php手机接口购物车怎么实现,php购物车的实现原理
  10. linux dd devzero,makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令