高效Java编码

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提供的多线程能力

10.1 在单线程中,尽量使用非线程安全类
10.2 在多线程中,尽量使用线程安全类,以及JDK提供原子操作类
10.3 尽量减少同步代码块范围
10.4 尽量使用线程池减少线程开销
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值