如何编写高效代码?这是每个研发团队都面临的一个重大问题。《阿里Java高效代码50例》(实际54例)来源于实际经验,帮助我们成为编写高效代码的软件工程师。
类别 | 要点 |
常量&变量 | 直接赋值常量值,禁止声明新对象 |
当成员变量值无需改变时,尽量定义为静态常量 | |
尽量使用基本数据类型,避免自动装箱和拆箱 | |
如果变量的初值会被覆盖,就没有必要给变量赋初值 | |
尽量使用函数内的基本类型临时变量 | |
尽量不要在循环体外定义变量 | |
不可变的静态常量,尽量使用非线程安全类 | |
不可变的成员变量,尽量使用非线程安全类 | |
对象&类 | 禁止使用JSON转化对象 |
尽量不使用反射赋值对象 | |
采用Lambda表达式替换内部匿名类 | |
尽量避免定义不必要的子类 | |
尽量指定类的final修饰符 | |
方法 | 把跟类成员变量无关的方法声明成静态方法 |
尽量使用基本数据类型作为方法参数类型,避免不必要的装箱、拆箱和空指针判断 | |
尽量使用基本数据类型作为方法返回值类型,避免不必要的装箱、拆箱和空指针判断 | |
协议方法参数值非空,避免不必要的空指针判断 | |
协议方法返回值非空,避免不必要的空指针判断 | |
被调用方法已支持判空处理,调用方法无需再进行判空处理 | |
尽量避免不必要的函数封装 | |
尽量指定方法的final修饰符 | |
表达式 | 尽量减少方法的重复调用 |
尽量避免不必要的方法调用 | |
尽量使用移位来代替正整数乘除 | |
提取公共表达式,避免重复计算 | |
尽量不在条件表达式中用!取反 | |
对于多常量选择分支,尽量使用switch语句而不是if-else语句 | |
字符串 | 尽量不要使用正则表达式匹配 |
尽量使用字符替换字符串 | |
尽量使用StringBuilder进行字符串拼接 | |
不要使用""+转化字符串 | |
数组 | 不要使用循环拷贝数组,尽量使用System.arraycopy拷贝数组 |
集合转化为类型T数组时,尽量传入空数组T[0] | |
集合转化为Object数组时,尽量使用toArray()方法 | |
集合 | 初始化集合时,尽量指定集合大小 |
不要使用循环拷贝集合,尽量使用JDK提供的方法拷贝集合 | |
尽量使用Arrays.asList转化数组为列表 | |
直接迭代需要使用的集合 | |
不要使用size方法检测空,必须使用isEmpty方法检测空 | |
非随机访问的List,尽量使用迭代代替随机访问 | |
尽量使用HashSet判断值存在 | |
避免先判断存在再进行获取 | |
异常 | 直接捕获对应的异常 |
尽量避免在循环中捕获异常 | |
禁止使用异常控制业务流程 | |
缓冲区 | 初始化时尽量指定缓冲区大小 |
尽量重复使用同一缓冲区 | |
尽量设计使用同一缓冲区 | |
尽量使用缓冲流减少IO操作 | |
线程 | 在单线程中,尽量使用非线程安全类 |
在多线程中,尽量使用线程安全类 | |
尽量减少同步代码块范围 | |
尽量合并为同一同步代码块 | |
尽量使用线程池减少线程开销 |
示例代码,详见原文:https://blog.51cto.com/13851865/2462569