上周一和周二参加了Best Practise for WAS的培训,获益匪浅,不过手中的资料太杂乱了,现在对其中的JAVA编程优化注意事项进行一下整理,全文如下:
1. 对象产生过程中的一些优化技巧:
不要在循环中产生对象;
尽量用原数据类型而避免使用包装类对象;
对象使用完后要将引用地址赋值为空;
尽量避免定义和使用类变量,而应该尽力使用局部变量;
LazeObjectCreation,在对象需要使用时再产生,然后赋值为NULL;
类的继承链不要太长,因为在类构造时将会调用父类的构造方法并对父类的变量进行初始化,如果继承链太长将会增加类的生成开销。
2. String和StringBuffer的选择策略:
String(Immutable不可变),StringBuffer(mutable可变的),这样当出现String += “append”;这种代码时一共出现了三个String对象,首先”append”是literal[j1] 的,因此它是一个String对象,而String是Immutable类型的,因此它必须生成一个新的String对象来包含旧的String内容和”append”的值;而StringBuffer的append方法则不需要产生一个新的StringBuffer对象,直接在原有StringBuffer对象后增加新的内容;
String(Immutable)是CompileTimeResolution,而StringBuffer(mutable)是RunTimeResolution的,这样String = “aa”+”bb”+”cc”+”dd”这样的赋值并不会产生三个新的String对象来保存中间运算结果,它将被JAVA编译器优化为String=”aabbccdd”;
StringBuffer在创建时最好指定容量,如果未指定容量则在当前默认容量满了之后将会分配新的内存并将旧的和新的内容拷贝到新内存中,这样将开销很大。
3. 异常优化的处理:
在JAVA中最基本的错误处理类为:java.lang.Throwable,其派生子类为Error和Exception,而Error的处理一般是由JVM来完成的,例如:Example of Error is OutOfMemoryError.;
不要用异常来做除程序异常外的任何事,例如用来执行程序逻辑,这是因为异常处理在JAVA中是非常耗费资源,开销很大的操作;
尽量避免使用“Exception e”这种参数来捕捉异常,在可以的情况下尽量用可预期的异常类型来作为catch捕捉的类型参数;
将资源释放的操作放在finally中,这样即时异常发生也能避免资源泄漏和空转的情况;
如无设计上的考虑,尽量将异常处理操作放在发现异常的类中,避免向外层抛出,异常抛出处理的代价是很高的;
不要在循环内部使用try-catch,而应该将循环放在try中;
4. 循环处理的优化;
使用局部变量int类型作为循环的index变量,如果使用函数作为判断条件,由于函数的开销因素这是很不恰当的做法,如果使用byte或short型,这两种类型都会被隐式的转换为int型;
使用System.arraycopy()而避免使用循环来完成数组的拷贝;
在循环中使用局部变量来代替直接使用数组元素;
如果有多个逻辑表达式作为循环的判断条件,在&&操作时考虑将为true可能性较大的表达式放置在左边,如果||操作,则将得到false可能性大的表达式至于左边;
[j1]JVM maintains an internal list of references for interned Strings ( pool of unique Strings) . When JVM loads String literal from class file and executes, it
checks whether that String exists in the internal list or not.