在项目中随手把 haseMap 改成了 currenHaseMap 差点被公司给开除了
前言
在项目中随手把 haseMap 改成了 currenHaseMap 差点被公司给开除了。
判断相等
字符串判断相等
字符串判断相等我们记住一定要常量写前面。
借助 jdk 提供的 util 帮助类(Objects)。
自定义工具类,进行判空处理。
包装类判断相等
为什么 n3== n4 是 false 呢?由于包装类的缓存机制。
包装类的比较用 equals 去判断。
最推荐的还是用工具类去判断。例如上面的列子如果 n3=null 的话 n3.equals(n4)这时候就会抛出 npe 了。如果用工具类的话就不会存在这种情况。总之一句话判断相等如果不愿意去判空(偷懒、代码也不好看)就借助工具类。合理使用工具类可以使你的代码减少不必要的 npe。
三目运算符
这个常见的坑的话就是由于自动拆箱导致的 NPE 异常。这个阿里巴巴开发手册(需要这个手册可以关注公众号回复"JAVA")说的很明白了。
BigDecimal
禁止使用浮点数 double,float 的初始化
输出结果
这个结果是不是跟我们所期望的 1.001 有点不一样。
float 和 double 可以用于工程计算科学计算,他们会有精度丢失,这是由于浮点运算器的结构导致的,但是在金融领域一旦精度出现问题就意味着可能是严重的现实经济损失,所以普通的那些数值型一般不会在这个场景下使用。
所以涉及金钱的计算一定不要使用 float 和 double。使用 BigDecimal 并且一定要用 String 来构造。 上面的列子我们可以这样来初始化 new BigDecimal("1.001")。
进行除法运算时必须要设置保留小数位
输出
解决办法:使用如下两个函数设置精度
divide(num, scale)
divide(num, scale, roundingMode)
字符串分隔(别忘了转义)
输出结果
结果并不是我们所期待的,java、php、c++。
解决办法我们对|进行转义分割,代码改为 String[] split = str.split("\\|");结果就正确了。
String 的 split 方法需要转义的字符串<font style color="red">:. $ | ( ) [ { ^ ? * + \ </font> 共 12 个特殊字符,遇到以这些字符进行分割字符串的时候,需要在这些特殊字符前加双反斜杠\ \。
Arrays.asList 需要谨慎使用
下面列举一些常用但是却与我们所期待的结果不一样的用法。
将基本类型数组作为 asList 的参数
输出的结果是 1 不是 3 哦是不是跟想象的有点不一样?原因如下:
由于 Arrays.ArrayList 参数为可变长泛型,而基本类型是无法泛型化的,所以它把 int[] array 数组当成了一个泛型对象,所以集合中最终只有一个元素 array 。
将数组作为 asList 参数后,修改数组或 List
输出结果
是不是也与我们所期待的不一样。修改了数组奥了的值居然影响到了集合里面的值。原因如下:
由于 asList 产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化,这在平时我们编码时可能产生莫名的问题。
数组转换为集合后,进行增删元素。
输出结果:
抛出异常原因:由于 asList 产生的集合并没有重写 add,remove 等方法,所以它会调用父类 AbstractList 的方法,而父类的方法中抛出的却是异常信息。
当我们使用 Arrays.asList 产生的集合时候,需要谨慎的去使用。如果需要对集合进行操作的时候我们可以通过 List list = new ArrayList(Arrays.asList(array)); 来进行使用。
currenHaseMap 注意 key 和 value 的 null 值
记得刚开始工作的时候,我负责的一个管理系统里面有一个关于省份的缓存,用 HashMap 来存的。大概就是项目一起动,然后就从 db 里面把省份信息加载到 HashMap 里面,以后需要用到省份信息直接从 HashMap 里面取,HashMap 不是线程不安全吗?然后我反手就把它改成了 currenHaseMap。测试环境测试没问题,然后就跟着其他功能上线。上完线之后也没有去回归关于省份的这一块内容,然后就下班了。第二天上班运营反映有部分注册用户的省份信息没了。leader 就找我昨天有没有改过关于省份的代码,我说就改了一个 currenHaseMap。leader 先让昨天上线代码回退,一回退省份信息就有了。后面经过仔细排查原来生产数据库有一条省份信息是空的。然后加载那条空的省份信息到 currenHaseMap 就报空指针了,在这条空记录后面信息就没加载到 currenHaseMap 了。幸好是内网管理系统没有造成太大的影响 。
string.valueof
这里的 parmMap.get("userName") 如果是 null , 那么这里的 userName 就是 “null” ,这是一个值为 null 的字符串。导致数据会拼接到 SQL 中,导出出错。为什么会这样我们看下源码就知道了。
所以转字符串的时候我们要根据实际的情况来选择合适的方法。
### 总结
本文列举了一些对于 java 常见的一些可能稍微不注意就会采坑的一些知识点。还有其他更多需要注意的知识点也欢迎大家来补充。其实这些常见的采坑基本上只要去看下源码都能够避免的。
结束
由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。
如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。
感谢您的阅读,十分欢迎并感谢您的关注。
版权声明: 本文为 InfoQ 作者【java金融】的原创文章。
原文链接:【http://xie.infoq.cn/article/5180c46ce394f1441eafa7678】。文章转载请联系作者。
评论 (4 条评论)