35个Java代码性能优化总结

代码优化的目标是:

1、减小代码的体积

2、提高代码运行的效率

代码优化细节:

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

带有final修饰符的类是不可派生的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。

2、尽量重用对象

特别是String对象的使用,出现字符串连接时应该使StringBuilder/StringBuffer代替。

3、尽可能使用局部变量

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

4、及时关闭流

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

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

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

  建议替换为:

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

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

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

7、慎用异常

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

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

因为当StringBuilder达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,无论何时只要StringBuilder达到它的最大容量,它就不得不创建一个新的字符数组然后将旧的字符数组内容拷贝到新字符数组中—-这是十分耗费性能的一个操作。

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

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

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

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();}

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

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

13、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList

14、尽量使用HashMapArrayListStringBuilder,除非线程安全需要,否则不推荐使用HashtableVectorStringBuffer,后三者由于使用同步机制而导致了性能开销。

15、不要将数组声明为public static final

因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变。

16、尽量在合适的场合使用单例

17、尽量避免随意使用静态变量

  要知道,当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的,如:

public class A{ private static B b = new B();}
此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止。

18、及时清除不再需要的会话

19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历

实现RandomAccess接口的类实例,假如是随机访问的,使用普通for循环效率将高于使用foreach循环;反过来,如果是顺序访问的,则使用Iterator会效率更高。

可以使用类似如下的代码作判断:

if (list instanceof RandomAccess){ for (int i = 0; i < list.size(); i++){}else{Iterator<?> iterator = list.iterable(); while (iterator.hasNext()){iterator.next();}}
foreach循环的底层实现原理就是迭代器Iterator,所以后半句反过来,如果是顺序访问的,则使用Iterator会效率更高的意思就是顺序访问的那些类实例,使用foreach循环去遍历。

20、使用同步代码块替代同步方法

21、将常量声明为static final,并以大写命名

22、不要创建一些不使用的对象,不要导入一些不使用的类

23、程序运行过程中避免使用反射

24、使用数据库连接池和线程池

25、使用带缓冲的输入输出流进行IO操作

  带缓冲的输入输出流,即BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream,这可以极大地提升IO效率。

26、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList

27、不要让public方法中有太多的形参,可以封装成对象使用。

28、字符串变量和字符串常量equals的时候将字符串常量写在前面。

29、不重要。。。略

30、不要对数组使用toString()方法

31、不重要。。。略

32、公用的集合类中不使用的数据一定要及时remove

如果一个集合类是公用的(也就是说不是方法里面的属性),那么这个集合里面的元素是不会自动释放的,因为始终有引用指向它们。所以,如果公用集合里面的某些数据不使用而不去remove掉它们,那么将会造成这个公用集合不断增大,使得系统有内存泄露的隐患。

33、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢。

1String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断

  2Integer.toString()方法就不说了,直接调用了

3、i + “”底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串

34、不重要。。。略

35、对资源的close()建议分开操作

比如我有这么一段代码:

try{XXX.close();YYY.close();}catch (Exception e){...}

  建议修改为:

try{ XXX.close(); }catch (Exception e) { ... }try{ YYY.close(); }catch (Exception e) {... }

  虽然有些麻烦,却能避免资源泄露。我们想,如果没有修改过的代码,万一XXX.close()抛异常了,那么就进入了cath块中了,YYY.close()不会执行,YYY这块资源就不会回收了,一直占用着,这样的代码一多,是可能引起资源句柄泄露的。而改为下面的写法之后,就保证了无论如何XXXYYY都会被close掉。

转载于:https://www.cnblogs.com/archermeng/p/7537531.html

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

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

相关文章

android编程绘图,Android编程绘图操作之弧形绘制方法示例

本文实例讲述了Android编程绘图操作之弧形绘制方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** 绘制弧形图案* description&#xff1a;* author ldm* date 2016-4-25 下午4:37:01*/public class ArcsActivity extends Activity {Overrideprotected void onCr…

JS多个对象添加到一个对象中

var obj1 {"qq":10}; var obj2{"mm":2,"nn":3}; var obj3{"xx":1,"yy":5}; obj1.field1 obj2; obj1.field2 obj3; console.log(obj1)转载于:https://www.cnblogs.com/thiaoqueen/p/7111697.html

Caffe cuDNN

Ref: http://jetsonhacks.com/2015/01/20/nvidia-jetson-tk1-cudnn-install-caffe-example/ 转载于:https://www.cnblogs.com/nn0p/p/4351026.html

linux平台之如何查看svn账号

1、平台 在ubuntu 2、如何查看svn账号 1)、 到svn.simple目录 cd ~/.subversion/auth/svn.simple 2&#xff09;、然后在svn.simple目录下查看文件 这个目录很多文件&#xff0c;我们随便cat/vim一下就可以看到了

C#将dataGridView中显示的数据导出到Excel(大数据量超实用版)

开发中很多情况下需要将dataGridView控件中显示的数据结果以Excel或者Word的形式导出来,本例就来实现这个功能。由于从数据库中查找出某些数据列可能没必要显示出来,在dataGridView中将对应的列隐藏了,这时导出时就会将隐藏的列导出来,显然不是我们所预期的。做法是先将dat…

BeetleX实现MessagePack和Protobuf消息控制器调用websocket服务详解

最近有用户问如何使用BeetleX封装一个基于Protobuf格式的websocket服务并支持控制器调用&#xff1b;其实BeetleX.FastHttpApi是支持Websocket服务和自定义数据格式的&#xff0c;但需要对组件有一定了解的情况才能进行扩展&#xff1b;接下来通过封装一个支持Protobuf和Messag…

vue 获取url地址的参数_2020年 vue常见面试问题总结(干货)!

1.什么是mvvm模式&#xff0c;谈谈你的理解&#xff1f; MVVM - Model View ViewModel&#xff0c;数据&#xff0c;视图&#xff0c;视图模型view 可以通过 事件绑定 的方式影响 model&#xff0c;model 可以通过 数据绑定 的形式影响到view&#xff0c;viewModel是把 model 和…

CSS 定位之绝对与相对

static,relative,absolute,fixed含义 static(静态定位):元素框正常生成。块级元素生成一个矩形框&#xff0c;作为文档流的的一部分&#xff0c;行内元素则会常见一个或多个行框&#xff0c;至于其父元素中。默认值。没有定位&#xff0c;元素出现在正常的流中&#xff08;忽略…

理解云计算备份与灾难恢复

如今&#xff0c;云计算和用户生态系统有一个新的转变&#xff0c;IT的转化创造了一个独特的“数据需求”环境。这意味着有放在这些工作负荷的详细的信息工作和更大的恢复需求。IT管理人员负责管理他们的备份系统&#xff0c;并必须准备好他们的灾难恢复策略。适当的恢复方法是…

SQL Server CLR 集成简介

公共语言运行库 (CLR) 是 Microsoft .NET Framework 的核心,为所有 .NET Framework 代码提供执行环境。 在 CLR 中运行的代码称为托管代码。 CLR 提供执行程序所需的各种函数和服务,包括实时 (JIT) 编译、分配和管理内存、强制类型安全性、异常处理、线程管理和安全性。 …

安卓 收起软件盘

public static void collapseSoftInputMethod(Context context, View v) {if (v ! null) {InputMethodManager imm (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(v.getWindowToken(), 0);}}传入上下文&#xff…

IOS学习笔记之十七 (NSDate、NSDateFormatter、NSCalendar、NSDateComponents、NSTimer)

1、NSDate 时间与日期的初始化,主要有 [NSDate date]; 2、NSDateFormatter 主要用于NSString和Date之间相互转化//NSDate转NSStringstringFromDate:dt//NSString转NSDatedateFromString 3、NSCalendar和NSDateComponents Date打印出具体时间的年月日和把年月日转化为Date4、N…

android studio adil位置,在Android Studio 中正确使用adil ”绝对经典“

今天调用远程服务中遇到了一个问题&#xff0c;哎&#xff0c;调了2个小时&#xff0c;后来终于解决&#xff0c;总结来看还是对新的Android Studio 不够熟悉。那么。。。。就可以睡觉啦&#xff01;&#xff01;&#xff01;在Android Studio中使用进程通信机制adil时一定要注…

[第二篇]如何在ASP.Net Core的生产环境中使用OAuth保护swagger ui

在我上篇文章如何在ASP.Net Core的生产环境中保护swagger ui中&#xff0c;我们讨论了如何使用基本身份验证来保护 swagger ui。使用 OAuth 2.0 和 OpenIdConnect 进行保护随着应用程序越来越多地使用 OAuth 和 OpenIdConnect&#xff0c;应用程序很有可能使用 OAuth 和 OpenID…

python opencv 图像切割_【OpenCV+Python】图像的基本操作与算术运算

图像的基本操作在上个教程中&#xff0c;我们介绍了使用鼠标画笔的功能。本次教程&#xff0c;我们将要谈及OpenCV图像处理的基本操作。本次教程的所有操作基本上都和Numpy相关&#xff0c;而不是与OpenCV相关。要使用OpenCV编写更好的优化代码&#xff0c;需要Numpy的丰富知识…

CLR触发器

using System; using System.Data; using System.Data.SqlClient; using Microsoft.SqlServer.Server;public partial class Triggers {// 为目标输入现有表或视图并取消对属性行的注释[Microsoft.SqlServer.Server.SqlTrigger (Name"Trigger1", Target"Unit_E&…

IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)

1、 copy、mutableCopy方法 copy方法返回对象的不可修改的副本 mutableCopy方法返回的对象可修改的副本 1)、测试demo int main(int argc, char * argv[]) {autoreleasepool {NSMutableString *book [NSMutableString stringWithString:"chenyu"];NSMutableStrin…

编程心得03

新的一年2016&#xff0c;再接再厉&#xff01; 转载于:https://www.cnblogs.com/Anzhongliu/p/6091848.html

光伏领跑者火热前行 可靠性护航“长跑”

随着第三批光伏领跑者申报标准的出台&#xff0c;在目前普通电站指标有可能缩水的情况下&#xff0c;2017年8-10GW的光伏领跑者项目又将成为各电站投资商争夺的“红海”。光伏领跑者在过去两年时间里为行业带来的变化有目共睹&#xff0c;从模式创新到电价下降&#xff0c;快速…

鸿蒙os系统被推送,鸿蒙来了!华为大规模推送鸿蒙OS系统,造成网站一度瘫痪...

千呼万唤始出来&#xff0c;期盼已久的手机鸿蒙OS系统终于迎来了大规模推送&#xff01;今年2月份在华为Mate X2折叠屏手机发布会上&#xff0c;华为就曾表示将在4月份开始大规模推送鸿蒙OS系统&#xff0c;4月27日通过测试申请的用户正式接到升级鸿蒙OS系统的通知&#xff0c;…