Java代码性能优化总结

Java代码优化的目标是:1、减小代码的体积   2、提高代码运行的效率。
具体优化方法有下面几种:
1、及时关闭流
Java编程过程中,进行数据库连接、I/O流操作时务必小心,使用完毕后,及时关闭以释放资源,因为对这些大对象的操作会造成系统大的开销。
2、尽量减少对变量的重复计算
对方法的调用,即使方法中只有一句语句,也是有消耗的,例如:
for(int i=0;i<list.size();i++)建议替换为for(int i=0,int length=list.size();i<length;i++)
这样在list.size()很大的时候,就减少了不必要的消耗。
3、尽量采用懒加载的策略,即在需要的时候才创建
String aa="123";if(i==1){...} 
可以将变量定义放在if条件判断里面if(i==1){String aa="123";}这样可以提高程序运行效率。
4、慎用异常 
异常对性能不利,只要有异常被抛出,Java虚拟机就必须调用堆栈,因为在处理过程中创建了一个新的对象。
5、循环内不要不断创建对象引用
例如for(int i=1;i<=count;i++){Object obj = new Object();}
这种做法会导致内存中有count份Objct对象引用存在,count很大的话,就消耗内存了,建议修改为
Object obj = null;
for(int i=0;i<=count;i++){obj = new Object();}
这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间。
6、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时使用ArrayList。
7、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。
8、单例要使用在恰当的场合
使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但不是所有地方都可以使用单例,概括来说,单例主要适用于以下三个方面:
(1) 控制资源的使用,通过线程同步来控制资源的并发访问。
(2) 控制实例的产生,以达到节约资源的目的。
(3) 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。
9、尽量避免随意使用静态变量
public class A {private static B b = new B();}
此时静态变量b的生命周期与A类相同,如果A类不被卸载,那么引用B指向的B对象会常驻内存,直到程序终止。
10、及时清除不再使用的会话
许多应用服务器都有默认的会话超时时间,一般为30分钟。当应用服务器需要保存更多的会话时,如果内存不足,那么操作系统会把部分不活跃的会话数据转储到磁盘。如果会话要被转储到磁盘,那么必须先要被序列化,大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时,应当及时调用HttpSession的invalidate()方法清除会话。
11、使用同步代码块替代同步方法
除非能确定整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
12、不要创建一些不使用的对象,不要导入一些不使用的类
这毫无意义,如果代码中出现"The value of the local variable i is not used"、"The import java.util is never used",那么请删除这些无用的内容。
13、使用数据库连接池和线程池
这两个池都是用于重用对象的,前者可以避免频繁地打开和关闭连接,后者可以避免频繁地创建和销毁线程
14、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
15、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList。
16、不要让public方法中有太多的形参
public方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:
(1)、违反了面向对象的编程思想,Java讲求一切都是对象,太多的形参,和面向对象的编程思想不契合。
(2)、参数太多势必导致方法调用的出错概率增加。
17、不要在循环中使用try...catch...,应该把其放在最外层。
18、程序运行过程中避免使用反射
反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法。
19、把一个基本数据类型转为字符串,data.toString()是最快的方式、String.valueOf(data)次之、data+""最慢
(1)、String.valueOf()方法底层调用了Integer.toString()方法,但是会在调用前做空判断
(2)、Integer.toString()直接调用
(3)、data+""底层使用了StringBuilder实现,先用append方法拼接,再用toString()方法获取字符串
显而易见,(2)最快、(1)次之、(3)最慢
20、尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的,为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行
效率作用重大。
21、尽量重用对象
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。
22、乘法和除法
用移位操作替代乘除法操作可以极大地提高性能。
23、选择合适的引用机制
在JSP应用系统中,页头、页脚部分往往被抽取出来,然后根据需要引入。当前JSP页面中引入外部资源的方法主要有两种:include指令及include动作。
include指令:<%@ include file="copyright.html" %>,该指令在编译时引入指定的资源。在编译之前,带有include指令的页面和指定的资源被合并成一个文件。外部资源在引用时就确定,比运行时才确定更高效。
include动作:<jsp:include page="copyright.html" />,该动作引入指定页面执行后生成的结果。由于它在运行时完成,因此对输出结果的控制更加灵活。但是,只有当被引用的内容频繁地改变时,或者对主页面的请求没有出现之前,被引用的页面无法确定时,使用
include动作才合算。
24、尽量使用继承,继承的方法越多,你要写的代码量也就越少。
25、日期类型的对象会占用很大的空间,如果你要存储大量的日期对象,可以考虑把它存储为long类型,然后在使用的时候转换为Date类型。
26、类名、方法名、变量名尽量使用简短的名字。
27、将常量声明为static final,并以大写命名
这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量。
28、不要对超出范围的基本数据类型做向下强制转型
比如从long型转为int型,可能得不到你想要的结果。Java中long型是8个字节64位的,int型是4个字节32位的。

转载于:https://my.oschina.net/u/3298482/blog/1531203

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值