关于比较
你是否代码里面还存在这样的代码
if( a!=null && a.equals(b) ){.............}
优化后
if(Objects.equals(a,b)){.......}
所实现的效果一样但是后者更优雅,它存在于java,util包下
关于Integer.parseInt();
如果传入参数的是'abc'会怎样,会抛出一个NumberFormatException
优化后
NumberUtils.toInt('abc',0)//表示如果不能转换则默认为0;
包位于org.apache.commons.lang3.math.NumberUtils;
关于sql函数
如果要查询指定日期的数据你是否会这样写sql
WHERE DATE(create_datetime) ='2017-12-04'
该条件最大的问题是等号的左边用了函数,所以导致该条sql不能用索引
优化后
WHERE create_datetime >= '2017-12-20' and create_datetime<'2017-12-21'
其中‘2017-12-20’ 等价于‘2017-12-20 00:00:00’
你真的会用StringBuild吗
大家都知道StringBuild拼接sql的时候性能比较好,但是我发现在实际工作环境大家用得并不好。
在java中当我们出现字符串拼接用'+'时,实际上编译器会对‘+’做优化
编译后用javap查看字节码文件指令
这里,就必须要大体解释一下这个invokespecial是个什么东西。它的作用是调用实例初始化方法,私有方法,父类的方法。
实际编译后的代码为
所以如果用了StringBuild就不要在append方法里面用‘+’
优化后:
关于SimpleDateFormate
工作中我发现很多人对线程安全理解得不够深致使不能很好的使用他
由于SimpleDateFormate是线程不安全的所以不能把它声明全局的变量或者常量。
推荐时间和日期的处理使用joda
关于流的关闭
这段代码能正确的关闭流吗?No
我们查看下ByteArratOutputStream的close方法发现它的实现为空
所以上面直接ByteArratOutputStream的close方法是不能关闭流的,而ByteArratOutputStream是不需要关闭的。
所以正确的做法是
或者java7以后
关于执行本地系统程序
这段代码很简单,调用系统的一个程序,将html转换为pdf
这段代码潜在的问题在于,在访问量多的时候会出现性能问题,甚至会成为整个操作系统的瓶颈,原因在于java执行本地程序是创建一个操作系统进程(不是线程),也就是说调用一次操作系统里面会创建一个进程,这对java或者操作系统来说是很耗资源的操作,所以在工作中应当避免调用本地的应用程序。
关于spring事务回滚
spring默认回滚异常未RuntimeException,如果再service中出现了非RuntimeException,例如
那么当出现FileNotFundException时异常该事务不会回滚。
所以正确的做法是指定回滚的类型为Exception: