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设计中不 ...
随机推荐
- SQL server 表copy 到别一张表
SQL server 表copy 到别一张表 ------------------ INSERT INTO 表名 (表字段) SELECT 表1字段 FROM 表名2: ---------- ...
- 10个你不得不知的WEB移动端开发的兼容问题
1.IOS下input设置type=button属性disabled设置true,会出现样式文字和背景异常问题,使用opacity=1来解决 2.一些情况下对非可点击元素如(label,span)监听 ...
- HDU 6582 Path
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submissio ...
- optistruct线性求解一次二次单元应力位移比较
通过分析比较10mm.5mm.3mm.1mm的网格模型, 网格越细密: 位移与应力均趋于恒定值(收敛): 一次与二次单元的应力区域一致: 一次与二次单元的位移相差11.3%,一次单元的位移小. 所用的 ...
- centos6最小化安装默认没有 NetworkManager服务
转载Centos6最小化安装中设置网卡默认启动 Centos 6.0版本提供了一个"最小化"(Minimal)安装的选项.这是一个非常好的改进,因为系统中再也不会存在那些不必要 ...
- mysql语句练习50题
为了练习sql语句,在网上找了一些题,自己做了一遍,收益颇多.很多地方换一种思路,有更好的写法,欢迎指正. 题目地址:https://blog.csdn.net/fashion2014/article ...
- C printf格式化输出 的跨平台
printf()在不同的系统上,占位符的可能有不同的写法,如: %ld:long int, 32位平台4 bytes %lld: long long int, 32位平台8 bytes 可以考虑使用 ...
- rtti读取和设置属性
http://www.cnblogs.com/hnxxcxg/archive/2013/03/02/2940565.html rtti读取和设置属性 编辑器通过 Rtti 还能够调用一个类的方法, ...
- 005/搭建fabric环境(一)
一.安装虚拟机VMware 参考博客:https://blog.csdn.net/u013142781/article/details/50529030 Step1:下载ubuntu镜像 (约1.8G ...
- SQL server 2008r2 file is corrupt
下载的SQLManagement studio有问题,重新下载一遍后再安装就好了.安装顺序没问题. 在卸载SQL Server开始——运行:输入regedit 进入注册表编辑器,进入之后执行下列操作: ...