代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。

代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。

代码优化的目标是

  • 减小代码的体积

  • 提高代码运行的效率

代码优化细节

  • 1、尽量指定类、方法的final修饰符

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50%

  • 2、尽量重用对象

特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。

  • 3、尽可能使用局部变量

调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。

  • 4、及时关闭流

Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。

  • 5、尽量减少对变量的重复计算

明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所以例如下面的操作:

for (int i = 0; i < list.size(); i++) {...}

建议替换为:

for (int i = 0, int length = list.size(); i < length; i++) {...}

这样,在list.size()很大的时候,就减少了很多的消耗

  • 6、尽量采用懒加载的策略,即在需要的时候才创建

例如:

String str = "aaa";if (i == 1) { list.add(str); }

建议替换为:

if (i == 1) { String str = "aaa"; list.add(str); }

  • 7、慎用异常

异常对性能不利。抛出异常首先要创建一个新的对象,Throwable接口的构造函数调用名为fillInStackTrace()的本地同步方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。

  • 8、不要在循环中使用try…catch…,应该把其放在最外层

除非不得已。如果毫无理由地这么写了,只要你的领导资深一点、有强迫症一点,八成就要骂你为什么写出这种垃圾代码来了。

  • 9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度

比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等,以StringBuilder为例:

(1)StringBuilder()      // 默认分配16个字符的空间

(2)StringBuilder(int size)  // 默认分配size个字符的空间

(3)StringBuilder(String str) // 默认分配16个字符+str.length()个字符空间

可以通过类(这里指的不仅仅是上面的StringBuilder)的来设定它的初始化容量,这样可以明显地提升性能。比如StringBuilder吧,length表示当前的StringBuilder能保持的字符数量。因为当StringBuilder达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,无论何时只要StringBuilder达到它的最大容量,它就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中—-这是十分耗费性能的一个操作。试想,如果能预估到字符数组中大概要存放5000个字符而不指定长度,最接近5000的2次幂是4096,每次扩容加的2不管,那么:

(1)在4096 的基础上,再申请8194个大小的字符数组,加起来相当于一次申请了12290个大小的字符数组,如果一开始能指定5000个大小的字符数组,就节省了一倍以上的空间;

(2)把原来的4096个字符拷贝到新的的字符数组中去。

这样,既浪费内存空间又降低代码运行效率。所以,给底层以数组实现的集合、工具类设置一个合理的初始化容量是错不了的,这会带来立竿见影的效果。但是,注意,像HashMap这种是以数组+链表实现的集合,别把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。初始大小建议设置为2的N次幂,如果能估计到有2000个元素,设置成new HashMap(128)、new HashMap(256)都可以。

  • 10、当复制大量数据时,使用System.arraycopy()命令

  • 11、乘法和除法使用移位操作

例如:

for (val = 0; val < 100000; val += 5) { a = val * 8; b = val / 2; }

用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:

for (val = 0; val < 100000; val += 5) { a = val << 3; b = val >> 1; }

移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。

  • 12、循环内不要不断创建对象引用

例如:

for (int i = 1; i <= count; i++)
{Object obj = new Object(); }

这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:

Object obj = null;for (int i = 0; i <= count; i++) { obj = new Object(); }

这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了。

教你Java 代码性能优化小妙招,速速来看相关推荐

  1. java 代码性能优化_Java代码性能优化的几个小技巧

    Java代码性能优化的几个小技巧 时间:2017-08-07     来源:华清远见JAVA学院 代码优化是程序员必须懂得一门学问,所以不管是程序员还是准程序员,养成良好的代码优化习惯都是必须要养成的 ...

  2. java代码统计收藏量_干货收藏 | 35个Java 代码性能优化总结(上)

    原标题:干货收藏 | 35个Java 代码性能优化总结(上) 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这 ...

  3. 44个Java代码性能优化总结

    转载自 44个Java代码性能优化总结 代码优化的最重要的作用应该是:避免未知的错误.在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是 ...

  4. 【Java】44个Java代码性能优化总结

    1.概述 转载:44个Java代码性能优化总结 代码优化的最重要的作用应该是:避免未知的错误.在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最 ...

  5. 怎么给图片添加水印?教你一个图片加水印小妙招

    怎么给我们自己的图片添加上水印呢?在我们的日常生活中,我们会拍摄一些图片或者是自己通过制作软件来绘制出一些好看的图片上传到网上,很多小伙伴会通过这种方式来获取流量或关注度,甚至是产生一些利益,但是,由 ...

  6. 怎么把文字转换成语音?教你一个文字转语音小妙招

    怎么把文字内容转换成语音播报呢?很多小伙伴在工作中可能会遇到需要把一段文字制作成语音来使用,用来配字幕或者是喇叭重复播报,这时候很多小伙伴就会犯难,该怎么做才能把文字转换成语音呢?其实方法很简单,只需 ...

  7. 35 个 Java 代码性能优化总结

    http://mp.weixin.qq.com/s?__biz=MjM5MzMyNzg0MA==&mid=400312907&idx=3&sn=fee2e15f000b25e5 ...

  8. Java 代码性能优化

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  9. Java 代码性能优化总结

    前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...

  10. Java基础学习总结(135)——Java代码性能优化实践经验再总结

    前言 代码优化的最重要的作用应该是:避免未知的错误.在代码上线运行的过程中,往往会出现很多我们意想不到的错误,因为线上环境和开发环境是非常不同的,错误定位到最后往往是一个非常小的原因.然而为了解决这个 ...

最新文章

  1. 多用户MIMO系统中的天线选择技术和用户选择技术的MATLAB仿真
  2. summerDao-比mybatis更强大无需映射配置的dao工具
  3. linux是只读添加 来覆盖,Linux之指令 重定向 文件覆盖和文件追加
  4. Mysql 零距离-入门(一)
  5. xampp命令行连接MySql数据库
  6. 抄底王牌tdx 副图(无未來函数)
  7. 《Ray Tracing in One Weekend》——Chapter 10: Positionable camera
  8. Hibernate相关内容
  9. mvn执行编译时使用lib下的jar包
  10. android坐标画图软件下载,几何平板Geometry Pad(绘图,测量数字坐标轴)2.7.0
  11. python下载网易云音乐付费歌曲有哪些_Python3批量下载网易云音乐热歌榜
  12. python中随机函数import random作用_python学习之随机函数random
  13. 51单片机 ADC0832酒精传感器
  14. win10硬盘锁怎么解除_电脑磁盘加密了怎么解密_win10如何关闭硬盘加密
  15. Oracle 10.2 流复制问题(二)—— C001: large txn detected
  16. python 腾讯视频签到_Python处理腾讯视频
  17. 川土微电子 | CA-IF1051 CAN-FD收发器
  18. 正则表达式匹配非某字符串的情况
  19. win11 下beyondcompare 右键菜单中无“比较“
  20. 攻防世界 Miscellaneous-200

热门文章

  1. cuda-gdb 调试python中的module/cu文件
  2. ffmpeg命令基本语法和常见命令
  3. NavicatPremium-Mac-无法打开问题
  4. DPDK - RSS
  5. ARM与x86–蝶变ARM
  6. 深入分析MFC之GDI原理透析
  7. 学生信息管理系统html代码,学生信息管理系统源代码.doc
  8. SAP中文件的上传和下载
  9. C 语言是“最环保”的编程语言
  10. 163编辑器 自适应宽度 +更改高度