本文参考整理自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. nasm不是内部或外部命令

    使用nasm编译汇编的源文件: nasm -f bin first.asm -o first.bin 报错:nasm不是内部或外部命令,这种错误一看就知道,是没有配置环境变量. 点开后,选择path, ...

  2. mysql PRIMARY KEY约束 语法

    mysql PRIMARY KEY约束 语法 作用:PRIMARY KEY 约束唯一标识数据库表中的每条记录. 环形直线电机 说明:主键必须包含唯一的值.主键列不能包含 NULL 值.每个表都应该有一 ...

  3. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

  4. flex兼容问题

    display:flex作为C3的新属性,还是有的浏览器不支持的,那下面我们就来说一下他的兼容写法 .box{ display: -webkit-box; /* 老版本语法: Safari, iOS, ...

  5. Qt中图元对象的多重集成

    在继承自定义QGraphicsItem图元对象时,有时需要用到信号/槽机制,由于QGraphicsItem非QObject的子类 所以需要多重继承QObject,有一点需要特别注意:就是继承的顺序,一 ...

  6. Jquery $().each()与$.each(data,function(i,obj))区别

    在遍历DOM时,通常用$(selector).each(function(index,element))函数: 在遍历数据时,通常用$.each(dataresource,function(index ...

  7. EventBus和Otto第三方构架

    代码 添加依赖:implementation 'org.greenrobot:eventbus:3.0.0'1注册并声明订阅者,然后发布事件最后解除注册 @Override protected voi ...

  8. influxDB 1.3 中文文档

    influxDB是一个旨在处理高并发写入和查询负载的时序数据库,它是TICK框架的第二部分,influxdb用于任何包含大量时序数据应用的后台存储,包括Devops监控.应用指标数据.物联网传感器数据 ...

  9. kill的各种讯号?

    kill 程序 不仅仅只是k掉某个进程, 她还有很多作用和用途. 其实, 这也是linux的程序的一个特点: 一个程序(很多是 命令行的程序), 除了主要的作用外, 还有很多" 重要的, 有 ...

  10. java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据

    引入依赖 <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson& ...