一、浮点数据的处理
上节课孤尽老师给我们讲了浮点数为什么会出现精度损失的问题以及浮点数在二进制中存储的一个形式,这节课更加详细的讲述了浮点数由10进制转换到2进制的一个计算过程
例:5..2F 该数字的整数部分为101,小数部分应为0011001100110011001100110011...,因为尾数位置的有效位数只有23位,所以只能取到红色部分,黑色部分省略,这就是为什么浮点数会存在精度损失,所以暂时可表示为101.00110011001100110011001;然后将该数使用科学计数法计数得:1.01001100110011001100110 * 2^2,故尾数位为01001100110011001100110,指数位需要加上一个移码127为129所以是10000001,然后再最开始补上符号位0;
所以5.2存储时为 1 10000001 01001100110011001100110
所以如果要精确计算,可以将浮点数*10的倍数,将其转化为整数进行计算,或者使用BigDecimal。
BigDecimal使用时注意在初始化的时候建议使用字符串,而不要使用小数,另外在做数值比较的时候要用CompareTo,equals比较时不光比较数值的大小还会比较精度的位数。
二、日期数据的处理
Java传统的日期API:Date、SimpleDateFormat、Calendar
Java8新的日期API:LocalDate、LocalTime、LocalDateTime
传统API存在的问题:线程不安全,没有区分日期和时间对应的类、格式化不方便。
Java8新API除了解决以上问题外,还有清晰等优势。
格式化时注意:
yyyy:当前年份
YYYY:当前日期所在的周的年份,若该周跨年则为下一年。
MM:月份
dd:天
HH:24小时的小时
hh:12小时的小时
mm:分钟
ss:秒
如果要取得当前毫秒数可以使用System.currentTimeMillis(),不再需要new Date().getTime()了;
如果想要获取更精确的纳秒级时间,则使用System.nanoTime();
针对统计实践Java8中推荐使用Instant类。
三、控制语句避坑指南
switch要记得写break;否则会产生case穿透现象,导致多层调用和。
switch(x),当x=null时会NPE异常
1.控制语句使用的好习惯
if、else、for、while、do语句后面不管有多少条语句都建议加上大括号。
三元运算符在使用的时候要注意如果有包装类会存在拆箱操作,若包装类为null则会抛出NPE异常。
不要在其他表达式中插入赋值语句;
不要再判断条件中书写大量复杂的代码。
避免使用!逻辑运算符;
另外在高并发的情况下判断范围可以使用<=而不是==,==容易被击穿,比如秒杀活动的库存判断时,就可以使用<=,该方法也会存在穿透现象,但是穿透的不深,损失可以承受。
2.需要参数校验的场合
调用频次低的方法:因为测试的时候不一定测得到所以要加校验;
执行时间开销很大的方法:如果执行时间过长,那么参数校验尤为必要,不然等了半天最后失败GG不划算。
需要极高稳定性或可用性的方法;
对外提供的开放接口;
敏感权限入口;
公开接口需要提供入参保护。
3.不需要参数校验的场合
极有可能被循环调用的方法;
底层调用频度比较高的方法;
被声明成private的方法;
四、OOP设计
目的:可维护性、可重用性、可扩展性。
特征:
抽象:对需求进行业务抽象和建模分析,通过模型的行为组合去共同解决某一类问题。
封装:是一种对象内聚的表现形式,使模块之间耦合度变低,更具有维护性。
继承:继承使子类能够继承父类,获得父类的部分属性和行为,使模块更具有复用性。
多态:使模块在复用性的基础上更加有扩展性,使系统运行更有想象空间。
OOP规约:
所有复写方法,必须要加OverRide注解
避免使用Object入参
可变参数列表一定要放在最后
方法及属性:
所有的POJO类属性必须使用包装数据类型。
定义DO、DTO、VO等POJO对象时,不要赋初始默认值。
定义数据对象DO时,类型要与数据库匹配。
getter/setter方法中,不要增加业务逻辑
禁止在POJO类中同时存在xxx字段的isXxx()和getXxx()方法;
构造方法禁止加入业务逻辑。