一、 使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。所以非必要,尽量使用局部变量减少垃圾回收次数。
二、及时关闭流操作,释放资源
Java 编程过程中,进行数据库连接、I/O 流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。
三、减少对变量的重复计算
对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。
for (int i = 0; i < list.size(); i++){
do sth;
}
优化后为
for (int i = 0, int length = list.size(); i < length; i++){
do sth;
}
四、循环内不要不断创建对象引用
例如:
for (int i = 1; i <= count; i++) {
Object obj = new Object();
}
这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:
Object obj = null;
for (int i = 0; i <= count; i++) {
obj = new Object();
}
这样的话,内存中只有一份 Object 对象引用,每次 new Object() 的时候,Object 对象引用指向不同的 Object 罢了,但是内存中只有一份,这样就大大节省了内存空间了。
五、Map最高效的遍历方式
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("111", "222");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
Iterator<Map.Entry<String, String>> iter = entrySet.iterator();
while (iter.hasNext()) {
Map.Entry<String, String> entry = iter.next();
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
六、不要让public方法中有太多的形参
public 方法即对外提供的方法,如果给这些方法太多形参的话主要有两点坏处:
违反了面向对象的编程思想,Java 讲求一切都是对象,太多的形参,和面向对象的编程思想并不契合
参数太多势必导致方法调用的出错概率增加。
至于这个“太多”指的是多少个,3、4个吧。比如我们用 JDBC 写一个 insertStudentInfo() 方法,有10个学生信息字段要插如 Student 表中,可以把这10个参数封装在一个实体类中,作为 insert() 方法的形参。
七、慎用异常
异常对性能不利。抛出异常首先要创建一个新的对象,Throwable 接口的构造函数调用名为 fillInStackTrace() 的本地同步方法,fillInStackTrace() 方法检查堆栈,收集调用跟踪信息。只要有异常被抛出,Java 虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
八、不要在循环中使用try…catch…,应该把其放在最外层
九、尽量采用懒加载的策略,即在需要的时候才创建,减少资源浪费
例如:
String str = "aaa";
if (i == 1) {
list.add(str);
}
建议替换为:
if (i == 1) {
String str = "aaa";
list.add(str);
}
十、尽量重用对象
特别是 String 对象的使用,出现字符串连接时应该使用 StringBuilder/StringBuffer 代替。由于 Java 虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此,生成过多的对象将会给程序的性能带来很大的影响。
十一、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于线程安全使用同步机制而导致了性能开销
十二、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList
已知到数组大小的情况下,使用array。
十三、使用同步代码块替代同步方法
除非能确定一整个方法都是需要进行同步的,否则尽量使用同步代码块,避免对那些不需要进行同步的代码也进行了同步,影响了代码执行效率。
十四、使用带缓冲的输入输出流进行IO操作
带缓冲的输入输出流,即 BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升 IO 效率。
十五、字符串变量和字符串常量equals的时候将字符串常量写在前面
避免空指针异常。