今天这节课的内容是《Java代码避坑指南》。哈哈,不得不说,这节课算是对新手很友好的了!讲的大部分内容理解起来没有困难,而且如果都能记住后续将会少踩很多的坑!好了,话不多说,主要内容如下: 一.浮点数之间的等值判断 浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断 例如:(1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。 1.浮点数据避坑: ●BigDecimal 的等值比较应使用compareTo()方法,而不是equals()方法 ●equals(): 方法会比较值和精度(1.0与 1.00返回结果为false) ●compareTo(): 会忽略精度。
禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
IEEE二进制浮点数算术标准(IEEE754) 数运算标准,为许多CPU与浮点运算器所采用。该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。
二、日期数据类型 Java中传统日期API: ●Date:表示特定的瞬间,精确到毫秒 ●SimpleDateFormat: 继承DateFormat类,主要用来进行格式转换 ●Calendar: 工具类,为特定瞬间和一组日历字段之间的转换以及操作日历字段提供了方法
Java8新增日期API: ●LocalDate: 代表日期 ●LocalTime: 代表时刻 ●LocalDateTime:代表具体时间 ●Instant: 代表的是时间戳
日期格式化需要注意的问题: 日期格式化时,传入pattern中表示年份统一使用小写的y。 小写yyy:表示当天所在的年 大写YYY:代表是week in which year (JDK7 之后引入的概念) 意思是当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,返回的YYYY就是下一年。
在日期格式中分清楚大写的M和小写的m,大写的H和小写的h分别指代的意义 1.表示月份是大写的M; 2.表示分钟则是小写的m; 3.24 小时制的是大写的H; 4.12小时制的则是小写的h。 建议:在util类中将pattern进行预设,并定义好相关的处理方法。
获取当前毫秒数: System.currentTimeMillis();而不是new Date().getTime().如果想获取更加精确的纳秒级时间值,使用System.nanoTime的方式. 在JDK8中,针对统计时间等场景,推荐使用Instant类
控制语句之switch ●每个case要么通过continue/break/return等来终止,要么注释说明程序将继续执行到哪一个case为止. 在一个switch块内,都必须包含-个default语句并且放在最后.
当switch括号内的变量类型为String并且此变量为外部参数时,必须先进行null判断
控制语句规约(一) 在if/else/for/while/do语句中必须使用大括号,表达异常的分支时,少用if-else方式
控制语句强制规约(二) ●三目运算符高度注意类型对齐时,可能抛出因自动拆箱导致的NPE异常 condition?表达式1 :表达式2 ●说明:以下两种场景会触发类型对齐的拆箱操作: 1.表达式1或表达式2的值只要有一个是原始类型。 2.表达式1或表达式2的值的类型不-致,会强制拆箱升级成表示范围更大的那个类型。
控制语句好习惯: 不要在条件判断中执行其它复杂的语句,(尤其是条件表达式)中,插入赋值语句以提高可读性
大部分避免采用取反逻辑运算符
在高并发场景中控制语句规约: 在高并发场景中,避免使用”等于”判断作为中断或退出的条件,如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间判断条件来代替! 注意:UPDATE goods SET count = count - 1 WHERE id = #{id} and (count - 1) >= 0; 这个是解决高并发时绝对不会出击穿超卖问题的控制sql语句(秒杀减库存时)
需要参数校验的场合:
对外提供的开放接口,不管是调用频次低的方法。
RPC/API/HTTP接口。
执行时间开销很大的方法。此情形中,参数校验时间几乎可以忽略不计,但如果因为参数错误导致中间执行回退,或者错误,那得不偿失。敏感权限入口。需要极高稳定性和可用性的方法。
公开接口需要进行入参保护,尤其是批量操作的接口。
不需要参数校验的场合:
极有可能被循环调用的方法
底层调用频度比较高的方法
被声明成private等
所有的覆写方法,必须加@Override注解
00P规约-可变参数
◎避免使用Object
00P规约-对象的比较 .所有整型包装类对象之间值的比较,全部使用equals方法比较对于Integer var =?在128至127之间的赋值, Integer 对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。 ●应使用常量或确定有值的对象来调用equals。Object的equals方法容易抛空指针异常,推荐使用JDK7引入的工具类java.util.Objects#equals(Object a, Object b)
00P规约-方法及属性
构造方法里面禁止加入任何业务逻辑 数据库字段类型相匹配如果有初始化逻辑,请放在init方法中等
Keep Fighting!!!!!!