-
避免写太长的方法 方法不应该太长,并且限定每个方法适用于单个功能,较小的方法对于维护和性能都更好。java字节码会被加载到内存中,并且只有较小的方法才能系统jvm优化内联以提高效率。
-
避免if-else嵌套
反例
if (condition1) {
if (condition2) {
if (condition3 || condition4) { execute ..}
else { execute..}
正例
boolean result = (condition1 && condition2) && (condition3 || condition4)
- 避免在循环中获取集合大小
任何进行任何集合的迭代时,但是都首先获取集合的大小而不是在每次集合迭代时都获取
反例:
List<String> objList = getData();
for (int i = 0; i < objList.size(); i++) {
业务代码 ..
}
正例:
List<String> objList = getData();
int size = objList.size();
for (int i = 0; i < size; i++) {
业务代码 ..
}
- 避免直接在字符串上进行拼接
String 是不可变对象,所有的String操作都会再生成一个新的String对象,特别是我们习惯的 “+” 拼接操作,会生成很多对象,就会导致浪费非常多的内存。为了避免这种问题,我们可以使用StringBuilder(单线程缓解使用,线程不安全) 或者 StringBuffer(多线程环境使用,线程安全) 来进行字符串的拼接,它们不会产生重复的String开销。
反例:
String res = "";
for(String s : ss){
res += s;
}
return res;
正例:
StringBuilder sb = new StringBuilder();
for(String s : ss){
sb.append(s);
}
return sb.toStirng();
- 尽可能使用原始类型
java 的包装类型都继承于Object对象,其中自带了各种对象头信息,占用的内存空间更大,并且包装类型都分配在堆上,分配速度和效率(受GC影响)都完全比不过基本类型。基本类似分配在栈上,效率比包装类型高很多。所以应该尽可能地使用 int 或者 double 这样的类型,而不是使用Double.
- 避免使用BigDecimal 类型 我们知道BigDecimal类为十进制值提供了精确的精度。过度使用该对象会极大地阻碍性能,特别是当该对象用于计算循环中的某些值时。BigDecimal在长时间或双倍时间内使用大量内存来执行计算。如果精度不是非常必要的条件,或者如果我们确定计算值的范围不会超过long或double,我们可以避免使用BigDecimal,而是使用long或double和适当的强制转换。
金额业和电商系统中,经常使用的方式是把金额*100,转换成整数,然后使用long来做计算
-
避免频繁创建大对象 某些对象可能会持有大量的数据,这种的对象我们不应该重复创建它们,而是想办法复用.可以考虑使用单例模式或者池化模式。比如最常见的数据库连接池就是池化应用的一种。
-
使用成熟的类库,而不是自己写 使用现有的 API 进行开发,而不是为常见的东西编写新的代码。是提升开发效率必选之路。要相信,你所面对的问题,这个世界上其他优秀的程序员肯定也面临过。比如像apache、google提供的很多类库,使用范围非常高,代码质量/性能非常好,远比我们自己实现要简单轻松。
-
使用日志分级并去除无用日志
日志是现在每个应用都非常关键的地方,它还是可观测性三大支柱之一。但是过多的日志也会引起应用的性能问题,不良的日志使用方式也会导致日志的可读性差。同时还需要注意,不要把大对象直接通过日志打印。现代的日志框架提供了多种等级的日志,如ERROR、INFO、DEBUG,需要利用这些日志和响应的技术,减少我们应用程序的日志负担。
反面例子:
byte[] image ;
logger.info("image : " + toBase64(image));
正例:
byte[] image ;
logger.info("image size : " + image.length); // 图片一般都很大,从kb到mb级别,为了实现图片打印,反例中还转换成了base64,这也会使图片的大小增加30%.
- 在mysql查询中,只查询需要的字段
当我们从数据库查询我们想要的数据时,避免获取到哪些我们不需要的字段。仅查询哪些我们需要的字段。这可以减轻数据库的查询压力、数据传输压力。
下面给一个简单的例子:
我们需要给用户发送email,所以我们从用户表中获取用户的email邮箱信息。
select * from users where user_id = 3;
正确用法
select user_email from users where user_id = 3;