2022年Java程序优化大全 .pdf
《2022年Java程序优化大全 .pdf》由会员分享,可在线阅读,更多相关《2022年Java程序优化大全 .pdf(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Java 程序优化大全颜色说明颜色说明*橙色 * 重点优化对象,必须遵守。*黑色 * 能够提高性能,建议使用,但是不强制要求。一、避免在循环条件中使用复杂表达式在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。例子:import java.util.Vector; class CEL void method(Vector vector) for ( int i = 0; i vector.size(); i+) / Violation ; / . 更正:class CEL_fixed void method (Vector
2、 vector) int size = vector.size(); for ( int i = 0; i 10, Vector needs to expandfor ( int i = 0; i o.length; i+) v .add(o); / capacity before it can add more elements. public Vector v = new Vector(); / no initialCapacity. 更正:自己设定初始大小。 public Vector v = new Vector(20); public Hashtable hash = new Has
3、htable(10); 三、在 finally 块中关闭数据库连接、I/O 流操作,以释放资源程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally 块中去做。不管程序执行的结果如何,finally 块总是会执行的,以确保资源的正确关闭。例子:import java.io.*; publicclass CS publicstaticvoid main(String args) CS cs = new CS(); cs.method(); publicvoid method() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
4、 - - 名师精心整理 - - - - - - - 第 2 页,共 21 页 - - - - - - - - - FileInputStream fis = null; try fis = new FileInputStream(CS.java); int count = 0; while (fis.read() != -1) count+; System.out.println(count); catch (FileNotFoundException e1) catch (IOException e2) finally fis.close(); 四、使用 System.arraycopy (
5、) 代替通过来循环复制数组System.arraycopy () 要比通过循环来复制数组快的多。例子:publicclass IRB void method() int array1 = newint100; for ( int i = 0; i array1.length; i+) array1 = i; int array2 = newint100; for ( int i = 0; i array2.length; i+) array2 = array1; / Violation 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
6、 - 名师精心整理 - - - - - - - 第 3 页,共 21 页 - - - - - - - - - 更正:publicclass IRB void method() int array1 = newint100; for ( int i = 0; i 2.int div2 = a / 8; / should be replaced with a 3.int temp = a / 3; 更正:publicclass SDIV publicstaticfinalintNUM = 16; publicvoid calculate(int a) int div = a 2; int div2
7、 = a 3; int temp = a / 3; / 不能转换成位移操作 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 21 页 - - - - - - - - - 十、使用移位操作代替a * b 同上。但我个人认为, 除非是在一个非常大的循环内,性能非常重要, 而且你很清楚你自己在做什么,方可使用这种方法。否则提高性能所带来的程序晚读性的降低将是不合算的。例子:publicclass SMUL publicvoid calculate(int a) int mul
8、= a * 4; / should be replaced with a 2.int mul2 = 8 * a; / should be replaced with a 3.int temp = a * 3; 更正:package OPT; publicclass SMUL publicvoid calculate(int a) int mul = a 2; int mul2 = a 3; int temp = a * 3; / 不能转换 十一、在字符串相加的时候,使用 代替 ,如果该字符串只有一个字符的话例子:public class STR public void method(Strin
9、g s) String string = s + d / violation. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 21 页 - - - - - - - - - string = abc + d / violation. 更正:将一个字符的字符串替换成 public class STR public void method(String s) String string = s + d string = abc + d 十二、不要在循环中调用synchroni
10、zed(同步 )方法方法的同步需要消耗相当大的资料,在一个循环中调用它绝对不是一个好主意。例子:import java.util.Vector; publicclass SYN publicsynchronizedvoid method(Object o) privatevoid test() for ( int i = 0; i vector.size(); i+) method(vector.elementAt(i); / violation private Vector vector = new Vector(5, 5); 更正:不要在循环体中调用同步方法,如果必须同步的话,推荐以下方式
11、:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 21 页 - - - - - - - - - import java.util.Vector; publicclass SYN publicvoid method(Object o) privatevoid test () synchronized /在一个同步块中执行非同步方法for ( int i = 0; i vector.size(); i+) method (vector.elementAt(i); privat
12、e Vector vector = new Vector(5, 5); 十三、将 try/catch 块移出循环把 try/catch 块放入循环体内,会极大的影响性能,如果编译 JIT 被关闭或者你所使用的是一个不带 JIT 的 JVM ,性能会将下降21%之多 ! 例子:import java.io.FileInputStream; publicclass TRY void method(FileInputStream fis) for ( int i = 0; i size; i+) try / violation_sum += fis.read(); 名师资料总结 - - -精品资料欢
13、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 21 页 - - - - - - - - - catch (Exception e) privateint_sum ; 更正:将 try/catch 块移出循环void method (FileInputStream fis) try for ( int i = 0; i size; i+) _sum += fis.read(); catch (Exception e) 十四、对于 boolean值,避免不必要的等式判断将一个 boolean 值与一个tr
14、ue 比较是一个恒等操作(直接返回该boolean 变量的值 ). 移走对于boolean 的不必要操作至少会带来2 个好处:1)代码执行的更快(生成的字节码少了5 个字节 );2)代码也会更加干净。例子:public class UEQ boolean method (String string) return string.endsWith (a) = true; / Violation 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 21 页 - - - - -
15、- - - - 更正:class UEQ_fixed boolean method (String string) return string.endsWith (a); 十五、对于常量字符串,用String 代替StringBuffer 常量字符串并不需要动态改变长度。例子:public class USC String method () StringBuffer s = new StringBuffer (Hello); String t = s + World!; return t; 更正:把 StringBuffer 换成 String,如果确定这个String 不会再变的话,这将会
16、减少运行开销提高性能。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 21 页 - - - - - - - - - 十六、用StringTokenizer 代替indexOf() 和substring() 字符串的分析在很多应用中都是常见的。使用 indexOf() 和 substring()来分析字符串容易导致StringIndexOutOfBoundsException 。而使用StringTokenizer 类来分析字符串则会容易一些,效率也会高一些。例子:pub
17、licclass UST void parseString(String string) int index = 0; while (index = string.indexOf(., index) != -1) System.out .println(string.substring(index, string.length(); 十七、不要在循环体中实例化变量在循环体中实例化临时变量将会增加内存消耗例子:import java.util.Vector; publicclass LOOP void method(Vector v) for ( int i = 0; i v.size(); i
18、+) Object o = new Object(); o = v.elementAt(i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 21 页 - - - - - - - - - 更正:在循环体外定义变量,并反复使用import java.util.Vector; publicclass LOOP void method(Vector v) Object o; for ( int i = 0; i v.size(); i+) o = v.elementAt(i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年Java程序优化大全 2022 Java 程序 优化 大全
限制150内