周末重新整理了一下过往的笔记,发现以前有很多Java相关的经验都用txt或者word记录起来,于是稍微整理了一下全部打包放上网,做个记录也好。
Integer用equals,int用 ==
使用正则表达式的预编译功能,可以有效加快正则匹配速度。Pattern要定义为static final静态变量,以避免执行多次预编译。
private static final Pattern pattern = Pattern.compile(regexRule);
private void func(...) { Matcher m = pattern.matcher(content); if (m.matches()) { ... }
}
通过设置HashMap的初始化大小能够提高性能。
HashMap当内部维护的哈希表的容量达到75%时,触发rehash。所以初始化容量要设置成num/3x4,而不是num。阿里的java开发手册里也写了这条,而且阿里为了抵消舍入误差,建议初始化容量设置为num/3x4+1。
initialCapacity = expectedSize / 0.75F + 1.0F
具体的应用为
int size = list.size();
double hashSize = size/0.75+1;
Map map = new HashMap<>(hashSize);
// 关于SimpleDateFormat的正确写法如下
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
y 是Year, Y 表示的是Week year。Week year 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。
实体中包含实体写法
public class OrderInfoDto {......//另一个对象SubOrderDtoprivate SubOrderDto subOrderDto;
}
在遇到这种情况的时候,Mapper.xml中应该这样写
......
通过association标签将包含的对象也列举在resultMap里面。
实体中包含集合写法
public class ProcurementOrderVo {...... //含有另一个集合private List remarkList;
}
在遇到这种情况的时候,Mapper.xml中应该这样写
......
采用ASM的映射拷贝是最靠谱的一种做法。
当我们开启阿里代码扫描插件时,如果你使用了Apache BeanUtils.copyProperties进行属性拷贝,它会给你一个非常严重的警告。
因为,Apache BeanUtils性能较差,可以使用Spring BeanUtils或者Cglib BeanCopier来代替。结果表明,Cglib的BeanCopier的拷贝速度是最快的,即使是百万次的拷贝也只需要 10 毫秒!相比而言,最差的是 Commons 包的 BeanUtils.copyProperties 方法,100 次拷贝测试与表现最好的 Cglib 相差400 倍之多。百万次拷贝更是出现了2600 倍的性能差异!
查看源码,我们会发现 CommonsBeanUtils 主要有以下几个耗时的地方:
除了性能问题之外,在使用 CommonsBeanUtils 时还有其他的坑需要特别小心!
包装类默认值在进行属性拷贝时,低版本CommonsBeanUtils 为了解决Date为空的问题会导致为目标对象的原始类型的包装类属性赋予初始值,如Integer属性默认赋值为0,尽管你的来源对象该字段的值为null。这个在我们的包装类属性为null值时有特殊含义的场景,非常容易踩坑!例如搜索条件对象,一般 null 值表示该字段不做限制,而 0 表示该字段的值必须为0。
改用其他工具时当我们看到阿里的提示,知道了CommonsBeanUtils的性能问题,想要改用Spring的BeanUtils时,也要特别小心:
org.apache.commons.beanutils.BeanUtils.copyProperties(Object target, Object source);org.springframework.beans.BeanUtils.copyProperties(Object source, Object target);
从方法签名上可以看出,这两个工具类的名称相同,方法名也相同,甚至连参数个数、类型、名称都相同。但是参数的位置是相反的。因此,如果你想更改的时候,千万要记得,将 target 和 source 两个参数也调换过来!