Day11 JAVA 避坑指南
摘要
本文关于 JAVA 中出现的坑进行说明。
浮点数处理
背景
数的表示范围是有限的。整型可以精确的表示一个数据,浮点数近似表示一个数据???
单精度的数据存储格式
使用浮点数可能导致的结果:精度丢失。
单精度数据的存储格式是以 有效数字 + 指数 的方法存储的。
浮点数避坑方法
-
浮点数之间的等值判断,基本数据类型不能用 == 来比较。包装数据类型不能用 equals 来判断。
-
BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法
-
equals() 方法会比较值和精度
-
compareTo() 会忽略精度
-
禁止使用构造方法 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象
日期处理
传统日期的缺点
-
所有日期都是线程不安全的
-
日期、时间、时间戳没有明确对应的类
-
对于格式化和解析的需求无法满足
日期处理闭坑
书写格式
-
传入 pattern 中表示年份同意使用小写的 y
-
日期中分清M和m,H和h
-
获取当前毫秒数时,使用:System.currentTimeMillis()
处理方法
在工具类中写统一的 pattern。不需要再次定义。
控制语句处理
switch 控制语句
-
每个case通过 continue/break/return 来终结
-
要注释说明程序将继续执行到哪一个case为止
-
在一个 switch 内,都必须包含一个default语句并且放在最后
-
在表达异常的分支时,少用 if-else 语句
三目运算符
三目运算符高度注意类型对齐时,可能抛出因自动拆箱导致的NPE异常
condition?表达式1:表达式2
以下两种场景会触发类型对齐的拆箱操作:
-
表达式1或表达式2的值只有一个是原始类型
-
表达式1或表达式2的值类型不一致,会强制拆箱升级成表示范围更大的那个类型
高并发中的控制语句
在高并发场景中,避免使用“等于”判断作为终端或退出的条件。如果并发控制没有处理好,容易产生等值判断被击穿的情况。使用大于或小于的区间判断条件来代替等于。
OOP 设计
-
所有覆写的方法,必须加@Override注解
-
可变参数避免使用 Object
-
可变参数必须放在参数列表最后
-
尽量不用可变参数
-
所有整型包装类对象之间值的比较,全部使用 equals 方法
-
应使用常量或确定有值的对象调用 equals