一避免在循环条件中使用复杂表达式
在不做编译优化的情况下在循环中循环条件会被反复计算如果不使用复杂表达式而使循环条件值不变的话程序将会运行的更快
例子
import javautilVector;
class CEL {
void method (Vector vector) {
for (int i = ; i < vectorsize (); i++) // Violation
; //
}
}
更正
class CEL_fixed {
void method (Vector vector) {
int size = vectorsize ()
for (int i = ; i < size; i++)
; //
}
}
二为Vectors 和 Hashtables定义初始大小
JVM为Vector扩充大小的时候需要重新创建一个更大的数组将原原先数组中的内容复制过来最后原先的数组再被回收可见Vector容量的扩大是一个颇费时间的事
通常默认的个元素大小是不够的你最好能准确的估计你所需要的最佳大小
例子
import javautilVector;
public class DIC {
public void addObjects (Object[] o) {
// if length > Vector needs to expand
for (int i = ; i< olength;i++) {
vadd(o); // capacity before it can add more elements
}
}
public Vector v = new Vector(); // no initialCapacity
}
更正
自己设定初始大小
public Vector v = new Vector();
public Hashtable hash = new Hashtable();
参考资料
Dov Bulka Java Performance and Scalability Volume : ServerSide Programming
Techniques Addison Wesley ISBN: pp –
三在finally块中关闭Stream
程序中使用到的资源应当被释放以避免资源洩漏这最好在finally块中去做不管程序执行的结果如何finally块总是会执行的以确保资源的正确关闭
例子
import javaio*;
public class CS {
public static void main (String args[]) {
CS cs = new CS ();
thod ();
}
public void method () {
try {
FileInputStream fis = new FileInputStream (CSjava);
int count = ;
while (fisread () != )
count++;
Systemoutprintln (count);
fisclose ();
} catch (FileNotFoundException e) {
} catch (IOException e) {
}
}
}
更正
在最后一个catch后添加一个finally块
参考资料
Peter Haggar: Practical Java Programming Language Guide
Addison Wesley pp
四使用Systemarraycopy ()代替通过来循环复制数组
Systemarraycopy () 要比通过循环来复制数组快的多
例子
public class IRB
{
void method () {
int[] array = new int [];
for (int i = ; i < arraylength; i++) {
array [i] = i;
}
int[] array = new int [];
for (int i = ; i < arraylength; i++) {
array [i] = array [i]; // Violation
}
}
}
更正
public class IRB
{
void method () {
int[] array = new int [];
for (int i = ; i < arraylength; i++) {
array [i] = i;
}
int[] array = new int [];
Systemarraycopy(array array );
}
}
参考资料
五让访问实例内变量的getter/setter方法变成final
简单的getter/setter方法应该被置成final这会告诉编译器这个方法不会被重载所以可以变成inlined
例子
class MAF {
public void setSize (int size) {
_size = size;
}
private int _size;
}
更正
class DAF_fixed {
final public void setSize (int size) {
_size = size;
}
private int _size;
}
参考资料
Warren N and Bishop P () Java in Practice p
AddisonWesley ISBN
六避免不需要的instanceof操作
如果左边的对象的静态类型等于右边的instanceof表达式返回永远为true
例子
public class UISO {
public UISO () {}
}
class Dog extends UISO {
void method (Dog dog UISO u) {
Dog d = dog;
if (d instanceof UISO) // always true
Systemoutprintln(Dog is a UISO);
UISO uiso = u;
if (uiso instanceof Object) // always true
Systemoutprintln(uiso is an Object);
}
}
更正
删掉不需要的instanceof操作
class Dog extends UISO {
void method () {
Dog d;
Systemoutprintln (Dog is an UISO);
Systemoutprintln (UISO is an UISO);
}
}
七避免不需要的造型操作
所有的类都是直接或者间接继承自Object同样所有的子类也都隐含的等于其父类那么由子类造型至父类的操作就是不必要的了
例子
class UNC {
String _id = UNC;
}
class Dog extends UNC {
void method () {
Dog dog = new Dog ();
UNC animal = (UNC)dog; // not necessary
Object o = (Object)dog; // not necessary
}
}
更正
class Dog extends UNC {
void method () {
Dog dog = new Dog();
UNC animal = dog;
Object o = dog;
}
}
参考资料
Nigel Warren Philip Bishop: Java in Practice Design Styles and Idioms
for Effective Java AddisonWesley pp