1、常量 & 变量
Java 中存在两种类型的变量,基本类型+引用类型
1.1 直接赋值常量值,禁止声明新对象
1.2.当成员变量值无需改变时,尽量定义为静态常量
1.3.尽量使用基本数据类型,装箱 VS 拆箱
1.4.如果变量的初值会被覆盖,就没有必要给变量赋初值
1.5.尽量使用函数内的基本类型临时变量
在函数内,基本类型的参数和临时变量都保存在栈(Stack)中,访问速度较快;对象类型的参数和临时变量的引用都保存在栈(Stack)中,内容都保存在堆(Heap)中,访问速度较慢。在类中,任何类型的成员变量都保存在堆(Heap)中,访问速度较慢。
1.6.尽量不要在循环体外定义变量
在老版JDK中,建议“尽量不要在循环体内定义变量”,但是在新版的JDK中已经做了优化。通过对编译后的字节码分析,变量定义在循环体外和循环体内没有本质的区别,运行效率基本上是一样的。反而,根据“ 局部变量作用域最小化 ”原则,变量定义在循环体内更科学更便于维护,避免了延长大对象生命周期导致延缓回收问题 。
1.7.不可变的静态常量,尽量使用非线程安全类
1.8.不可变的成员变量,尽量使用非线程安全类
2、对象 & 类
2.1 禁止使用JSON转化对象
JSON提供把对象转化为JSON字符串、把JSON字符串转为对象的功能,于是被某些人用来转化对象。这种对象转化方式,虽然在功能上没有问题,但是在性能上却存在问题。
2.2 反射性能低,类似于 BeanUtils.copyProperties(userDO, userVO);
2.3 采用Lambda表达式替换内部匿名类,不是新的语法糖,使用 [ invokeDynamic ]
2.4.尽量避免定义不必要的子类
2.5.尽量指定类的final修饰符
为类指定final修饰符,可以让该类不可以被继承。如果指定了一个类为final,则该类所有的方法都是final的,Java编译器会寻找机会内联所有的final方法。内联对于提升Java运行效率作用重大,具体可参见Java运行期优化,能够使性能平均提高50%。
3、方法
3.1 把跟类成员变量无关的方法声明成静态方法,Class VS Object
3.2 参数 & 返回值,装箱 VS 拆箱
尽量使用基本数据类型作,避免不必要的装箱、拆箱和空指针判断
3.4 参数 & 返回值
协议编程,可以@NonNull和@Nullable标注参数,是否遵循全凭实现者自觉。 返回值推荐使用Optional
3.6.被调用方法已支持判空处理,调用方法无需再进行判空处理
3.7.尽量避免不必要的函数封装
3.8.尽量指定方法的final修饰符,final method can be inline
3.9 对于多常量选择分支,尽量使用switch语句而不是if-else语句
if-else语句,每个if条件语句都要加装计算,直到if条件语句为true为止。switch语句进行了跳转优化,Java中采用tableswitch或lookupswitch指令实现,对于多常量选择分支处理效率更高。经过试验证明:在每个分支出现概率相同的情况下,低于5个分支时if-else语句效率更高,高于5个分支时switch语句效率更高。
4、表达式
4.1 尽量减少方法的重复调用
for循环中,条件
4.2 提取公共表达式,避免重复计算
4.3 尽量不在条件表达式中用!取反
5、字符串
5.1.尽量不要使用正则表达式匹配
5.2.尽量使用字符替换字符串,字符长度为1,字符串长度不确定
5.3.StringBuilder 和StringBuffer的区别
5.4.不要使用""+转化字符串,建议使用 String.valueOf.
6、数组
6.1 System.arraycopy & Arrays.copyOf ,
6.2 集合转化为类型T数组时,尽量传入空数组T[0],
6.3 集合类型的toArray()
7、集合
7.1 初始化集合时,尽量指定集合大小,减少扩容操作
7.2 尽量使用Arrays.asList转化数组为列表
7.4 直接迭代需要使用的集合Map & List
7.5 不要使用size方法检测空,必须使用isEmpty方法检测空,保证方法复杂度为O(1)
7.6.非随机访问的List,尽量使用迭代代替随机访问,RandomAccess
7.8.避免先判断存在再进行获取
8、异常
8.1 直接捕获对应的异常
8.2 尽量避免在循环中捕获异常
8.3 禁止使用异常控制业务流程
9、缓冲区
9.1 初始化时尽量指定缓冲区大小
9.2 尽量重复使用同一缓冲区
9.4 尽量使用缓冲流减少IO操作, BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
10、线程
通过锁来控制多线程执行顺序,锁会降低效率,所以合理控制锁的范围,多线程困难,多使用JDK提供的多线程能力