如何提高java代码效率 java怎么提高( 三 )


15. 尽量在finally块中释放资源
程序中使用到的资源应当被释放 , 以避免资源泄漏 。这最好在finally块中去做 。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭 。
16. 尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作 , 使用移位的操作将会更快和更有效
17.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效
18. 尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组 。在使用中 , 如果超出这个大小 , 就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来 , 再 丢弃旧的数组 。在大多数情况下,你可以在创建 StringBuffer的时候指定大?。?这样就避免了在容量不够的时候自动增长,以提高性能 。
19. 尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象 会随着方法结束而变成垃圾 , 因此,大部分时候程序无需将局部,引用变量显式设为null.
20. 尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上 。
21. 尽量避免使用split
除非是必须的,否则应该避免使用split,split由于支持正则表达式 , 所以效率比较低 , 如果是频繁的几十 , 几百万的调用将会耗费大量资源,如果确实需 要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果 。
22. ArrayListLinkedList
一 个是线性表 , 一个是链表 , 一句话,随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指 针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据,不过这是理论性分析,事实未必如此,重要的是理解好2 者得数据结构,对症下药 。
23. 尽量使用System.arraycopy ()代替通过来循环复制数组
System.arraycopy() 要比通过循环来复制数组快的多
24. 尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降 , 推荐可以使用一些第三方的开源工具,如EhCache,Oscache进行缓存,他们基本都实现了FIFO/FLU等缓存算法 。
25. 尽量避免非常大的内存分配
有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的 。分配的内存块都必须是连续的,而随着堆越来越满 , 找到较大的连续块越来越困难 。
26. 慎用异常
当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的 。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大 。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作 。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素 。
如 果您创建一个 Exception ,就得付出代价 。好在捕获异常开销不大 , 因此可以使用 try-catch 将核心内容包起来 。从技术上讲,您甚至可以随意地抛出异常,而不用花费很大的代价 。招致性能损失的并不是 throw 操作--尽管在没有预先创建异常的情况下就抛出异常是有点不寻常 。真正要花代价的是创建异常 。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常 。异常是为异常的情况而设计的 , 使用时也应该牢记这一原则 。

推荐阅读