Java性能

写道
1. 尽量避免过多过常的创建Java对象; 最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。

2. 尽量使用局部变量, 尽量使用基本数据类型代替对象; 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。基本类型数据产生和处理都在栈中处理,包装类型是对象,是在堆中产生实例。

3. 尽量使用StringBuilder和StringBuffer进行字符串连接

4. 单线程应尽量使用HashMap、ArrayList; HashTable、Vector等使用了同步机制,降低了性能。

5. ArrayList & LinkedList; 随机查询尽量使用ArrayList,ArrayList优于LinkedList,LinkedList还要移动指针,添加删除的操作LinkedList优于ArrayList,ArrayList还要移动数据

6. 尽量合理的创建HashMap,避免扩容; 默认initialCapacity只有16,而loadFactor是 0.75

7. 尽量确定StringBuffer的容量,避免了在容量不够的时候自动增长; 默认大小(通常是16);

8. 尽量在finally块中释放资源;不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。

9. 尽量减少对变量的重复计算; for(int i=0;i<list.size();i++) -> for(int i=0,len=list.size();i<len;i++)

10. 尽量避免不必要的创建

A a = new A();
if(i==1){list.add(a);}
应该改为
if(i==1){
A a = new A();
list.add(a);}

11. 尽量避免使用二维数组; 二维数据占用的内存空间比一维数组多得多,大概10倍以上。

12. 尽量避免使用String的split方法; 确实需要频繁的调用split,可以考虑使用apache的StringUtils.split(string,char),频繁split的可以缓存结果。

13. 尽量使用System.arraycopy ()代替通过来循环复制数组

14. 尽量避免非常大的内存分配; 有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。

15. 尽量缓存经常使用的对象; 第三方的开源工具,如EhCache,Oscache进行缓存

16. 慎用异常;
当创建一个异常时,需要收集一个栈跟踪(stack track),这个栈跟踪用于描述异常是在何处创建的。构建这些栈跟踪时需要为运行时栈做一份快照,正是这一部分开销很大。当需要创建一个 Exception 时,JVM 不得不说:先别动,我想就您现在的样子存一份快照,所以暂时停止入栈和出栈操作。栈跟踪不只包含运行时栈中的一两个元素,而是包含这个栈中的每一个元素。
如果您创建一个 Exception ,就得付出代价。好在捕获异常开销不大,因此可以使用 try-catch 将核心内容包起来。从技术上讲,您甚至可以随意地抛出异常,而不用花费很大的代价。招致性能损失的并不是 throw 操作——尽管在没有预先创建异常的情况下就抛出异常是有点不寻常。真正要花代价的是创建异常。幸运的是,好的编程习惯已教会我们,不应该不管三七二十一就 抛出异常。异常是为异常的情况而设计的,使用时也应该牢记这一原则

17. 尽量使用移位来代替'a/b'的操作
"/"是一个代价很高的操作,使用移位的操作将会更快和更有效

int num = a / 4;
int num = a / 8;
应该改为
int num = a >> 2;
int num = a >> 3;
但注意的是使用移位应添加注释,因为移位操作不直观,比较难理解

18.尽量使用移位来代替'a*b'的操作
同样的,对于'*'操作,使用移位的操作将会更快和更有效

int num = a * 4;
int num = a * 8;
应该改为
int num = a << 2;
int num = a << 3;c

 

你可能感兴趣的:(java性能)