Day15 Java代码避坑指南

本文详细介绍了Java中浮点数据类型的精度问题、货币数据类型的存储选择,以及如何避免精度丢失。强调了BigDecimal在进行等值比较时的注意事项。此外,还讨论了Java传统和新日期API的使用,以及控制语句的避坑规范,如switch语句的使用细节和在高并发场景中的注意事项。最后提到了参数校验的重要性及其适用场景。
摘要由CSDN通过智能技术生成

请参考《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值