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设计中不 ...
随机推荐
- React Native 之FlatList
1.新建项目 2.因为要用到导航跳转, 所以添加依赖,,这里拷贝这个: "dependencies": { "@types/react": "^16. ...
- HDU 6153 A Secret ( KMP&&DP || 拓展KMP )
题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...
- 「树形结构 / 树形DP」总结
Codeforces 686 D. Kay and Snowflake 要求$O(n)$求出以每个节点为根的重心. 考虑对于一个根节点$u$,其重心一定在[各个子树的重心到$u$]这条链上.这样就能够 ...
- CG-CTF | 密码重置2
跟则提示走,美滋滋: 1.找到邮箱: 2.下载备份: 3.PHP弱类型,string与int用的是“==” ........这一行是省略的代码........ if(!empty($token)&am ...
- 利用python进行数据分析--pandas入门1
随书练习,第五章 pandas入门1 # coding: utf-8 # In[1]: from pandas import Series, DataFrame # In[2]: import pa ...
- angular ajax
在使用angular 发送ajax的时候,状态信息是正常的,状态码200,返回的参数是使用@responsebody转换后返回的字串.在前端却总是在调用错误的回调函数,也拿不到正确的反馈信息. 回调函 ...
- Day02 结构类型
1.结构类型是值类型 (类是引用类型) 2.结构中也可以像类一样,定义 字段 属性 方法 但是不能给字段赋初始值 3.结构的构造方法中,必须为所有的字段赋值 4.不能为结构显示定义无参数的构造 ...
- audit的日志
audit审计, audio 声音, 音频 audit的日志, 有两个可能的地方: 一是, /var/log/messages 文件中 二是, 如果开启了audit服务, 则 在/var/log/au ...
- Docker - 部署 Ant Design Pro 的项目
解读 Ant Design Pro 的 Docker 配置 package.json 的 scripts -f: 使用什么配置文件 -t: 标签 up: 启动服务(的容器) build: 构建或重新构 ...
- 004-windows(64位)下使用curl命令
一.下载工具包:http://curl.haxx.se/download.html 二.使用 使用方式一:在curl.exe目录中使用 解压下载后的压缩文件,通过cmd命令进入到curl.exe所在的 ...