Java编码技巧与代码优化
本文参考整理自https://mp.weixin.qq.com/s/-u6ytFRp-ZAqdLBsMmuDMw
对于在本文中有所疑问的点可以去该文章查看详情
常量&变量
直接赋值常量值, 禁止声明新对象,如
Long i = new Long(1L);当成员变量值无需改变时, 尽量定义为静态常量
尽量使用基本数据类型, 避免自动装箱和拆箱
如果变量会被覆盖就没必要赋初值
尽量使用函数内的基本类型临时变量
函数内, 基本类型的参数和临时变量都保存在栈中, 访问速度较快. 对象类型的参数和临时变量和引用都保存在栈中, 而内容都保存在堆中, 访问速度较慢
在类中, 任何类型的成员变量都保存在堆中
尽量不要在循环体外定义变量, 避免延长大对象生命周期导致延缓回收问题
不可变的静态常量和成员变量, 尽量使用非线程安全类
对象&类
禁止使用JSON转化对象, 应该手动包装来转化对象
先转化为JSON字符串再转为对应对象可以实现转化对象, 但是性能上存在问题
尽量不使用通过反射赋值对象, 会造成性能下降, 比如DTO取值赋值到VO
匿名内部类采用Lambda表达式, 因为Lambda表达式在大多数虚拟机中采用invokeDynamic指令实现, 效率会比匿名内部类更高
尽量避免定义不必要的子类,多一个类就需要多一份类加载
尽量指定类和方法的final修饰符
Java编译器会寻找机会内联所有的final, 具体参见Java运行期优化, 能够使性能平均提高50%
方法
把和类成员变量无关的方法声明为静态方法
尽量使用基本数据类型作为参数类型和返回值类型, 避免不必要的装箱拆箱和空指针判断
协议编程, 协议方法参数值与返回值非空
避免多余的判空处理
避免不必要的函数封装, 方法调用引起的额入栈和出栈会导致更多的CPU和内存消耗, 不过为了代码的简洁和清晰, 增加一定的方法是值得的
减少方法的重复调用
for (int i = 0, userLength = userList.size(); i < userLength; i++) {
...
}
尽量避免不必要的方法调用, 其实就是避免出现 调用了一个方法并将结果赋值, 赋的值还未起到作用, 就被覆盖了 的情况发生
尽量使用移位来代替正整数乘除
提取公共表达式
尽量少在条件表达式中用 ! 取反
当高于5个分支时, switch语句效率更高, 而非if else
字符串
尽量不要使用正则表达式匹配
尽量使用字符替换字符串, 因为字符长度固定为1, 查找和匹配的效率自然高
使用StringBuilder进行字符串拼接
使用String.valueOf来进行字符串转化
数组
使用System.arraycopy进行拷贝数组
集合转化为类型T数组时, 尽量传入空数组T[0]
集合转化为Object数组时, 尽量使用toArray()方法而非toArray(new Object[0])
集合
初始化集合时, 尽量指定大小, 减少扩容次数
尽量使用addAll()来批量拷贝
使用Arrays.adList()转化数组为列表
直接迭代需要使用的集合
不要用size()方法检测空, 用isEmpty方法检测, 因为某些size方法实现的时间复杂度可能是O(n)
尽量使用迭代遍历来代替for循环里get()
尽量使用HashSet判断值存在
避免先判断存在再获取, 因为会造成二次查找, 直接获取然后判断是否为空
异常
直接捕获各种异常, 而非instanceof
避免在循环中捕获, 在循环体外捕获可以提高执行效率
禁止使用异常控制业务流程, 比如 抛了异常就返回false
缓冲区
尽量重复使用同一缓冲区
使用缓冲流减少IO操作
线程
单线程中, 尽量使用非线程安全类
多线程中, 尽量使用线程安全类
尽量减少同步代码块范围
尽量合并为同一同步代码块
尽量使用线程池来减少线程开销
Java编码技巧与代码优化的更多相关文章
- 代码优化:Java编码技巧之高效代码50例
出处: Java编码技巧之高效代码50例 1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值. 反例: Long i = ...
- 偏执却管用的10条Java编程技巧
本文由 ImportNew - LynnShaw 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得 ...
- Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)
前几天就g+里面看到有人引用这篇博文.看了一下.受益颇多. 所以翻译过来,希望和大家一起学习.本人英语水平有限,假设有错,请大家指正. 原文地址(须要翻墙):http://ja ...
- java编码过滤器
1.java编码过滤器的作用: java过滤器能够对目标资源的请求和响应进行截取,过滤信息执行的优先级高于servlet. 2.java过滤器的使用: (1)编写一个普通的java类,实现Filter ...
- java中文乱码解决之道(四)-----java编码转换过程
前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...
- Java数组技巧攻略
Java数组技巧攻略 0. 声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...
- 资料推荐--Google Java编码规范
之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然这篇文章的 ...
- Java编码规范
1. Java命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写.1.1 一般概念 n 尽量使用完整 ...
- 10个精妙的Java编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
随机推荐
- nasm不是内部或外部命令
使用nasm编译汇编的源文件: nasm -f bin first.asm -o first.bin 报错:nasm不是内部或外部命令,这种错误一看就知道,是没有配置环境变量. 点开后,选择path, ...
- mysql PRIMARY KEY约束 语法
mysql PRIMARY KEY约束 语法 作用:PRIMARY KEY 约束唯一标识数据库表中的每条记录. 环形直线电机 说明:主键必须包含唯一的值.主键列不能包含 NULL 值.每个表都应该有一 ...
- POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )
题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 : ...
- flex兼容问题
display:flex作为C3的新属性,还是有的浏览器不支持的,那下面我们就来说一下他的兼容写法 .box{ display: -webkit-box; /* 老版本语法: Safari, iOS, ...
- Qt中图元对象的多重集成
在继承自定义QGraphicsItem图元对象时,有时需要用到信号/槽机制,由于QGraphicsItem非QObject的子类 所以需要多重继承QObject,有一点需要特别注意:就是继承的顺序,一 ...
- Jquery $().each()与$.each(data,function(i,obj))区别
在遍历DOM时,通常用$(selector).each(function(index,element))函数: 在遍历数据时,通常用$.each(dataresource,function(index ...
- EventBus和Otto第三方构架
代码 添加依赖:implementation 'org.greenrobot:eventbus:3.0.0'1注册并声明订阅者,然后发布事件最后解除注册 @Override protected voi ...
- influxDB 1.3 中文文档
influxDB是一个旨在处理高并发写入和查询负载的时序数据库,它是TICK框架的第二部分,influxdb用于任何包含大量时序数据应用的后台存储,包括Devops监控.应用指标数据.物联网传感器数据 ...
- kill的各种讯号?
kill 程序 不仅仅只是k掉某个进程, 她还有很多作用和用途. 其实, 这也是linux的程序的一个特点: 一个程序(很多是 命令行的程序), 除了主要的作用外, 还有很多" 重要的, 有 ...
- java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据
引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson& ...