黑马程序员技术交流社区

标题: 【石家庄校区】 对于java性能优化的这10个细节你知道吗? [打印本页]

作者: hfy198701    时间: 2019-8-28 19:15
标题: 【石家庄校区】 对于java性能优化的这10个细节你知道吗?
1. 多线程在未发生线程安全前提下应尽量使用HashMap、ArrayList
HashTable、Vector等使用了同步机制,降低了性能。
2. 尽量合理的创建HashMap
当你要创建一个比较大的hashMap时,充分利用这个构造函数
public HashMap(int initialCapacity, float loadFactor);

避免HashMap多次进行了hash重构,扩容是一件很耗费性能的事,在默认中initialCapacity只有16,而loadFactor是 0.75,需要多大的容量,你最好能准确的估计你所需要的最佳大小,同样的Hashtable,Vectors也是一样的道理。
3. 尽量减少对变量的重复计算

如:
for(int i=0;i<list.size();i++)

应该改为:
for(int i=0,len=list.size();i<len;i++)

并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。
4. 尽量避免不必要的创建
如:
A a = new A();
if(i==1){
list.add(a);
}

应该改为:

if(i==1){
A a = new A();
list.add(a);
}



5. 尽量在finally块中释放资源
程序中使用到的资源应当被释放,以避免资源泄漏,这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。
6. 尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作,使用移位的操作将会更快和更有效
如:int num = a / 4;
int num = a / 8;

应该改为:

int num = a >> 2;
int num = a >> 3;

但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解。
7.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效
如:
int num = a * 4;
int num = a * 8;

应该改为:

int num = a << 2;
int num = a << 3;


8. 尽量确定StringBuffer的容量
StringBuffer 的构造器会创建一个默认大小(通常是16)的字符数组。在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,你可以在创建 StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能。
如:StringBuffer buffer = new StringBuffer(1000);


9. 尽量早释放无用对象的引用
大部分时,方法局部引用变量所引用的对象会随着方法结束而变成垃圾,因此,大部分时候程序无需将局部,引用变量显式设为null。
例如:
Java代码Public void test(){
Object obj = new Object();
……
Obj=null;
}

上面这个就没必要了,随着方法test()的执行完成,程序中obj引用变量的作用域就结束了。但是如果是改成下面:
Java代码
Public void test(){
Object obj = new Object();
……
Obj=null;
//执行耗时,耗内存操作;或调用耗时,耗内存的方法
……
}

这时候就有必要将obj赋值为null,可以尽早的释放对Object对象的引用。
10. 尽量避免使用二维数组
二维数据占用的内存空间比一维数组多得多,大概10倍以上。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2