本文参考整理自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编码技巧与代码优化的更多相关文章

  1. 代码优化:Java编码技巧之高效代码50例

    出处:  Java编码技巧之高效代码50例 1.常量&变量 1.1.直接赋值常量值,禁止声明新对象 直接赋值常量值,只是创建了一个对象引用,而这个对象引用指向常量值. 反例: Long i = ...

  2. 偏执却管用的10条Java编程技巧

    本文由 ImportNew - LynnShaw 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得 ...

  3. Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)

                前几天就g+里面看到有人引用这篇博文.看了一下.受益颇多. 所以翻译过来,希望和大家一起学习.本人英语水平有限,假设有错,请大家指正. 原文地址(须要翻墙):http://ja ...

  4. java编码过滤器

    1.java编码过滤器的作用: java过滤器能够对目标资源的请求和响应进行截取,过滤信息执行的优先级高于servlet. 2.java过滤器的使用: (1)编写一个普通的java类,实现Filter ...

  5. java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,通过这三篇博客各位博友对各种字符编码有了一个初步的了解,要了解java的中文问题这是必须要了解的.但是了解这些仅仅只是一个开始,以下博客将侧重介绍java乱码是如何 ...

  6. Java数组技巧攻略

      Java数组技巧攻略 0.  声明一个数组(Declare an array) String[] aArray = new String[5]; String[] bArray = {" ...

  7. 资料推荐--Google Java编码规范

    之前已经推荐过Google的Java编码规范英文版了: http://google-styleguide.googlecode.com/svn/trunk/javaguide.html 虽然这篇文章的 ...

  8. Java编码规范

    1. Java命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写.1.1 一般概念 n 尽量使用完整 ...

  9. 10个精妙的Java编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

随机推荐

  1. CSS3画菱形和平行四边形以及立方体

    利用CSS3中的transform属性画菱形和平行四边形 transform 实现2D或是3D的变形转换,通过transform可以实现对元素的四种变换:旋转.缩放.移动.倾斜 一.菱形 菱形的特点: ...

  2. mysql OR运算符 语法

    mysql OR运算符 语法 作用:在 WHERE 子语句中把两个或多个条件结合起来. 语法:SELECT * FROM 表名 WHERE 字段1 运算符 值 OR 字段2 运算符 值 说明:如果第一 ...

  3. 所有input输入完成后,改变按钮颜色

    $(function(){ $('input').on('input propertychange',function(){ if(($.trim($('.add1').val())!==" ...

  4. 博弈论 x

    ——关于博弈论 四道例题带你走进博弈论~ (考虑必败态,必胜态) Ps:要理解这种思想,首先要明白什么叫必败态.说简单点,必败态就是“在对方使用最优策略时,无论做出什么决策都会导致失败的局面”.其他的 ...

  5. django model 操作总结

    使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足 ...

  6. tomcat安全配置参考

    0x01 基本配置 1 删除默认目录 安装完tomcat后,删除$CATALINA_HOME/webapps下默认的所有目录文件  rm -rf /srv/apache-tomcat/webapps/ ...

  7. bat语法

    注释 :: 注释无回显 rem 注释有回显 关闭和开启回显 :: 关闭回显 @echo off echo abc :: 开启回显 echo on echo 查看命令帮助说明 rd /? 目录操作 创建 ...

  8. Deepin 系统安装并配置PHP开发环境

    Deepin是由武汉深之度科技有限公司开发的Linux发行版.Deepin团队基于Qt/C++(用于前端)和Go(用于后端)开发了的全新深度桌面环境(DDE),以及音乐播放器,视频播放器,软件中心等一 ...

  9. Python Django的安装配置

    学习Django前,我们要确定电脑上是否已经安装了Python,目前Python有两个版本,不过这两个版本并不互相兼容,所以根据个人选择合适的版本. 因为从Django2.0开始将不再支持Python ...

  10. centos 7 安装Telnet并设为开机自启动、开防火墙端口

    [root@b ~]# rpm -qa | grep telnettelnet-0.17-64.el7.x86_64telnet-server-0.17-64.el7.x86_64[root@b ~] ...