Java初级优化
1. 对于明确不需要派生的类,添加final修饰符,此时该类的所有方法都是final的。Java编译器会寻找机会内联(inline)所有的final方法。(能使性能提升50%)
2. 尽量重用对象,避免生成过多的对象。对于String的连接,用StringBuffer代替。
3. 尽量少用全局变量如static等(heap中创建,慢),多用局部变量(Stack中创建,快)。
4. 不要重复初始化变量。默认情况下,调用类的构造函数时, Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和 double变量设置成0.0,逻辑值设置成false。当一个类从另一个类派生时,这一点尤其应该注意,因为用new关键词创建一个对象时,构造函数链中的所有构造函数都会被自动调用。即
class test{
private Object obj; //不需要写成 private Object obj=null;
}
5. 在java+Oracle的应用系统开发中,java中内嵌的SQL语言应尽量使用大写形式,以减少Oracle解析器的解析负担。
6. java编程过程中,进行数据库连接,I/O流操作,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销。
7. 过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。
JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。
8. 在使用同步机制时,尽量使用同步方法代替代码同步快。
9. 尽量减少对变量的重复计算。
例如:
for(int i=0; i<list.size(); i++)
应替换为:
for(int i=0, int len=list.size(); i< len; i++)
10. 需要时才创建变量或者对象。
例如:
String str=”hello”;
if(i==1){
list.add(str);
}
应替换为
if(i==1){
String str=”hello”;
list.add(str);
}
11. 慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象。Throwable接口的构造函数调用名为fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,VM就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。
异常只能用于错误处理,不应该用来控制程序流程。
12. 不要在循环中使用Try/Catch语句,若需要,应该放在最外层。
13. 若一个类实现了Cloneable,调用clone()方法创建类的实例。因为用new创建时,构造函数链中的所有构造函数都会被自动调用。
14. 乘法和除法
考虑下面的代码:
for (val = 0; val < 100000; val +=5) {
alterX = val * 8; myResult = val * 2;
}
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代 码:
for (val = 0; val < 100000; val += 5) {
alterX = val << 3; myResult = val << 1;
}
修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相当于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。
15. 尽量使用HashMap和ArrayList;除非必要,否则不推荐使用HashTable和Vector,后者由于同步机制导致了性能的开销。
16. 知道长度的情况下尽量使用定长数组array。
17. 当复制大量数据时,使用System.arraycopy()命令。
--------------------------------------------------------------------
PS: 欢迎关注公众号"Devin说",会不定期更新Java相关技术知识。
--------------------------------------------------------------------