代码优化
1、重复代码的提炼
寻找代码当中完成某项子功能的重复代码,找到以后请毫不犹豫将它移动到合适的方法当中,并存放在合适的类当中。
2、冗长方法的分割
我们在分割一个大方法时,大部分都是针对其中的一些子功能分割,因此我们需要给每一个子功能起一个恰到好处的方法名,这很重要。
3、嵌套条件分支的优化
有一个专业名词叫卫语句,可以治疗这种恐怖的嵌套条件语句。它的核心思想是,将不满足某些条件的情况放在方法前面,并及时跳出方法,以免对后面的判断造成影响。
还有种情况:嵌套条件分支与上面的有些许不同,它无法使用卫语句进行优化,而应该是将条件分支合并,以此来达到代码清晰的目的。由这两条也可以看出,嵌套条件分支在编码当中应当尽量避免,它会大大降低代码的可读性。
4、去掉一次性的临时变量
5、消除过长参数列表
对于一些传递了大批参数的方法,对于追求代码整洁的程序猿来说,是无法接受的。我们可以尝试将这些参数封装成一个对象传递给方法,从而去除过长的参数列表。
6、提取类或继承体系中的常量
7、让类提供应该提供的方法
8、提取继承体系中重复的属性与方法到父类
9、尽量指定类、方法的final修饰符
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,具体参见Java运行期优化。此举能够使性能平均提高50% 。
尽量重用对象:
特别是String对象的使用,出现字符串连接时应该使用StringBuilder/StringBuffer代替.
尽可能使用局部变量:
调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建,速度较慢。另外,栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
及时关闭流:
Java编程过程中,进行数据库连接、I/O流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。如果条件允许,即JDK7以上,强烈建议使用try-with-resources。
尽量减少对变量的重复计算
尽量采用懒加载的策略,即在需要的时候才创建
不要在循环中使用try…catch…,应该把其放在最外层
如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度:
比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet等等
当复制大量数据时,使用System.arraycopy命令
乘法和除法使用移位操作
循环内不要不断创建对象引用
尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销
不要将数组声明为public static final
尽量在合适的场合使用单例
尽量避免随意使用静态变量:
要知道,当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的
及时清除不再需要的Session:
如果会话要被转储到磁盘,那么必须要先被序列化,在大规模集群中,对对象进行序列化的代价是很昂贵的。因此,当会话不再需要时,应当及时调用HttpSession的invalidate方法清除会话。
实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历:
假如是随机访问的,使用普通for循环效率将高于使用foreach循环;反过来,如果是顺序访问的,则使用Iterator会效率更高。
使用同步代码块替代同步方法
将常量声明为static final,并以大写命名
程序运行过程中避免使用反射:
反射是Java提供给用户一个很强大的功能,功能强大往往意味着效率不高。不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的invoke方法,如果确实有必要,一种建议性的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—-用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。
使用带缓冲的输入输出流进行IO操作:
带缓冲的输入输出流,即BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,这可以极大地提升IO效率。
不要对数组使用toString方法
不要对超出范围的基本数据类型做向下强制转型
把一个基本数据类型转为字符串,基本数据类型.toString是最快的方式、String.valueOf次之、数据+””最慢
使用最有效率的方式去遍历Map