本文参考整理自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. 6362. 【NOIP2019模拟2019.9.18】数星星

    题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...

  2. 运输计划noip

    靠!这道题TM搞了我好几天,真是烦死人!!!早上打了一个倍增的TM只有95分QAQ... 然后一气之下开始不断卡常,各种玄学优化,可是就是T..TAT.. 可恶!晚上我就直接打了个tarjan,还好跑 ...

  3. HDU 6614 AND Minimum Spanning

    Time limit 1000 ms Memory limit 131072 kB OS Windows 中文题意 给一张n个点的无向完全图(输入一个n就完事了),每个点标号为1~n,每条边的边权为它 ...

  4. JS中包含6种错误类型

    1.SyntaxError(语法错误) 解析代码时发生的语法错误 eg:var 1a; Uncaught SyntaxError: Unexpected number 2.ReferenceError ...

  5. 3D Computer Grapihcs Using OpenGL - 01 环境设置

    这系列文章是我学习Youtube上一套OpenGL教程的笔记,自己对教程的案例重新制作并且做了一定程度的修改(更有条理,且修正了一些问题).后续将持续更新. Visual Studio 2017工程 ...

  6. Scrapy 学习笔记爬豆瓣 250

    Scrapy 是比较上层的库,基于中间层开发,它基于高层,所以它依赖许多其它库.事件驱动的异步技术. Scrapy 爬取网页,以豆瓣电影 Top 250 为例子. 首先打开命令提示符,输入.scrap ...

  7. twitter api的使用

    1.用手机号注册推特账号 https://twitter.com/ 2.进入网站 https://apps.twitter.com/ 创建第一个app,填入基本信息 name写完会检测是否已经存在像我 ...

  8. db2数据库表操作错误SQL0668N Operation not allowed for reason code "1" on table "表". SQLSTATE=57016的解决方法

    错误sql Operation not allowed for reason code "1" on table "MARKET.PURE_USER".. SQ ...

  9. Initialization of bean failed; nested exception is java.lang.

    网上搜寻各种解说,applicationContext-hibernate.xml 配置错误,jar冲突等等 现场错误图: 解决方法: asm-attrs.jar cglib-nodep-2.1_3. ...

  10. ORACLE内存管理之ASMM AMM

    ORACLE ASMM ORACLE AMM ASMM转换至AMM AMM转换至ASMM