请参考《Java开发手册–嵩山版》
浮点数据处理
浮点型
浮点数时属于有理数中某特定子集的数字表示,在计算机中用于近似表示任意某个实数
整型
计算机中一个基本的专业术语,指没有小数部分的数据,可准确地表示数据
货币数据类型选择
任何货币金额均以最小货币单位且整型类型来进行存储
浮点数据类型的问题
精度丢失
科学计数法
阶码位存储的是指数对应的移码,移码公式:x移 = x + (2^n-1 - 1)
IEEE754标准规定
单精度的阶码偏移量为 2^n-1即为127,这样能表示的指数范围为[-126, 127]
指数最大值能取到127
精确的小数存储 decimal
MySQL:decimal(M, D)
M:指定小数点左边和右边可以存储的十进制数字的最大个数,MySQL范围为[1, 65]
D:指定小数点右边可以存储的十进制数字的最大个数。小数位数必须小于M,默认小数位是0
Java:BigDecimal类
浮点数据避坑
1、浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用equals来判断
2、BigDecimal的等值比较应使用compareTo(),而不是equals()
equals()会比较值和精度(1.0与1.00的返回结果是false)
compareTo()会忽略精度
3、禁止使用构造方法BigDecimal(double)将double值转换为BIgDecimal对象
日期数据的处理
Java传统日期API
Date:表示特定的瞬间,精确到毫秒
SimpleDateFormat:继承DateFormat类,主要用来进行格式转换
Calendar:工具类,为特定瞬间和一组日历字段之间的转换,以及操作日历字段提供了方法
传统日期API问题
所有的日期类都是线程不安全的
日期、时间、时间戳没有对应的类
对于格式化和解析的需求
JDK提供了java.text.DateFormat抽象类,
但通常情况下,SimpleDateFormat类被用于此类需求
Java8新增日期API
LocalDate:代表日期
LocalTime:代表时刻
LocalDateTime:代表具体时间
Instant:代表时间戳
新增API的优势
不变性
关注点分离
清晰
实用操作
日期格式化需要注意的问题
yyyy:表示当天所在的年
YYYY:表示当天所在的周属于的年份
M:月份
m:分钟
H:24小时制
h:12小时制
建议:在util类中将pattern进行预设,并定义好相关的处理方法
System.currentTimeMillis() 毫秒级时间,不使用new Date().getTime()
System.nanoTime() 纳秒级时间
Instant 针对统计时间等场景(时间戳)
控制语句的避坑规范
控制语句switch
- case通过continue/break/return终止
- 或者注释说明程序将继续执行哪一个case
- 一个switch必须包含一个default语句,并放在最后
1、当switch括号内的变量类型为String,此变量为外部参数时,必须先进行null判断
2、在if/else/for/while/do语句中必须使用大括号;表达异常的分支时,少使用if-else
3、三目运算符高度注意类型对齐时,可能抛出因自动拆箱导致的NPE异常
控制语句好习惯
1、不要在其他表达式(尤其是条件表达式)中,插入赋值语句
2、不要在条件判断中执行其他复杂的语句,以提高可读性
3、合理使用取反逻辑运算符
当表达equals等没有直接反例的情况时,必须采用取反
有对应反例,比如 > 跟 <= 避免使用取反
高并发场景中控制语句规约
高并发场景中,避免使用“等于”判断作为终端或退出的条件
若并发控制没有做好,容易产生等值判断被“击穿”,使用区间判断代替
需要参数校验的场合
1、调用频次低的方法
2、执行时间开销很大的方法。
3、需要极高稳定性和可用性的方法
4、对外提供的开放接口,包括RPC/API/HTTP接口
5、敏感权限入口
6、公开接口需要进行入参保护,尤其是批量操作的接口
无需参数校验的场合
1、极有可能被循环调用的方法
2、底层调用频度比较高的方法
3、被声明成private