2. 尽量减少对变量的重复计算
3. 尽量采用懒加载的策略
4. 尽量重用对象
5. 及时关闭流
6. 慎用异常
* 异常对性能不利,抛出异常先要创建一个新的对象,throwable接口的构造函数调用名为fillInStackTrace()本地同步方法
* 此方法检查堆栈,收集调用跟踪信息,只要有异常就抛出.(异常只能用于错误处理,不可用来控制程序流程)
7. 不要在循环中使用 try...catch...
8. 容器初始化 尽可能指定长度 如:new ArrayList<>(128); new HashMap<>(256);等避免自动扩容带来性能消耗
9. 当复制大量数据时, 使用System.arraycopy()命令
10. 基于效率和类型检查的考虑,应该可能使用array ,无法确定数组大小时再使用ArrayList
11. 尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用
* Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销
12. 不要将数组声明为public static final
* 将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变
13. 尽量在适合的场景使用单例
* 使用单例可减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有场合都适用单例
可使用单例的场景如下:
1> 控制资源的使用,通过线程同步来控制资源的并发访问
2> 控制实例的产生,以达到节约资源为目的
3> 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
14. 尽量避免随意使用静态变量
当某个对象定义为static的变量所引用,那么gc通常不会回收这个对象所占有的堆内存
15. ArrayList 随机遍历快,linkedList 添加/删除快
ArrayList 基于数组 有下标,遍历较快,
linkedList 基于链表 添加/删除只需改变指向就好
顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList
16. 尽量使用同步代码块代替同步方法
17. 不可创建一些不使用的对象,不要导入一些不使用的类
18. 程序运行过程中避免使用反射,(反射功能强大但效率不高)
19. 使用数据库连接池 和线程池
这两个池都是用于重用对象的,前者可避免频繁打开和关闭连接,后者可避免频繁创建和销毁线程
20. 尽量使用带缓冲的输入输出流进行IO操作
* 带缓冲的输出流: 即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream这可极大地提升IO效率
21. 把一个基本数据类型转为字符串,基本数据类型.toString()最快 String.valueOf(数据)次之, 数据 + ""最慢
22. 遍历Map 最有效率的方法
Map<String,String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet())
{
String key = entry.getKey();
String value = entry.getValue();
}
或者
Map<String,String> map = new HahsMap<>();
Set<Map.Entry<>String,String> entry = map.entrySet(); Iterator<Map.Entry<String,String>> iter = entry.iterator();
while(iter.hasNext())
{
Map.Entry<String,String> entry = iter.next();
}
23. 对资源的close()建议分开操作