本文参考整理自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. STM32内部时钟设置-寄存器版

    STM32寄存器版本——内部时钟设置 同时要记得把延时初始化函数设置好 //系统时钟初始化函数 //pll:选择的倍频数,从2开始,最大值为16 //pll:选择的倍频数,这里使用内部时钟,PLL为4 ...

  2. es6的扩展运算符

    扩展运算符用三个点号表示,功能是把数组或类数组对象展开成一系列用逗号隔开的值,扩展运算符有几点作用: 一,展开数组 //展开数组 let a = [1,2,3,4,5], b = [...a,6,7] ...

  3. RabbitMQ绑定、队列、消息、虚拟主机详解(五)

    Binding:绑定,Exchange和Exchange.Queue之间的连接关系 Binding中可以包含RoutingKey或者参数 Queue:消息队列,实际存储消息数据 Durability: ...

  4. NAT网关之SNAT进阶使用(一)SNAT POOL

    摘要: NAT网关是云上VPC ECS访问Internet的出入口.SNAT可实现指定的VPC ECS使用指定的公网IP访问互联网.阿里云NAT网关控制台创建SNAT条目时,默认是为指定的交换机配置1 ...

  5. HTML5和CSS3兼容清单

    1.CSS3 2.CSS3选择器 3.HTML5 4.HTML5 From  

  6. JavaScript modularity with RequireJS (from spaghetti code to ravioli code)

    http://netmvc.blogspot.com/2012/11/javascript-modularity-with-requirejs.html Today I would like to d ...

  7. python 浮点运算

    print(format(float(a)/float(b),'.2f'))

  8. HTTP代理(转)

    个人总结: 两篇文章介绍了https代理的两种方式: ·一种是普通http请求代理 ·一种是通过隧道进行基于tcp的代理 转两篇好文: HTTP 代理原理及实现(一) https://imququ.c ...

  9. shift()函数

    用于对dataframe中的数整体上移或下移, 当为正数时,向下移. 当为负数时,向上移. 缺少的会填充NaN 参考: https://blog.csdn.net/kizgel/article/det ...

  10. JSP程序不能正常运行 MyEclipse10 Tomcat6.0

    我写的sp程序,上午运行正常:但是下午再打开运行会提示对jsp解释失败 谁知道这是怎么回事呢? 后来是发现: 要运行JSP程序 Myeclipse10和Tomcat6的jdk都要调整到jdk1.7的版 ...