|
| 1 | +##### 1.使用BigDecimal替代Float和Double |
| 2 | + |
| 3 | +主要Float和Double是使用类似于科学计数法那样"有效数字+指数"来表示的,所以在二进制存储时,是会丢失精度,没法做到精准的。所以浮点数之间不能使用==等值判断,浮点数包装类型之间不能使用equals |
| 4 | + |
| 5 | +```java |
| 6 | +float a = 1.0f - 0.9f; |
| 7 | +float b = 0.9f - 0.8f; //通过debug调试发现这两次减运算减下来,a和b的值存在一些差异,不是一模一样的,丢失了精度 |
| 8 | +Boolean result = a == b;//结果是false |
| 9 | + |
| 10 | +Float x = 1.0F - 0.9F; |
| 11 | +Float y = 0.9F - 0.8F; |
| 12 | +Boolean result = x.equals(y);//结果是false |
| 13 | +``` |
| 14 | + |
| 15 | +解决方案: |
| 16 | + |
| 17 | +1. 任何货币金额,均以最小货币单位且整型类型来进行存储。例如在数据库里面存10000,代表是100.00元。 |
| 18 | + |
| 19 | +2. 使用Bigdecimal来存这些值,并且进行加减。 |
| 20 | + |
| 21 | +```java |
| 22 | +BigDecimal a1 = new BigDecimal("1.0"); |
| 23 | +BigDecimal b1 = new BigDecimal("0.9"); |
| 24 | +BigDecimal c1 = new BigDecimal("0.8"); |
| 25 | + |
| 26 | +BigDecimal a2 = a1.subtract(b1); |
| 27 | +BigDecimal b2 = b1.subtract(c1); |
| 28 | + |
| 29 | +System.out.println(a2.equals(b2));//打印结果是true |
| 30 | +``` |
| 31 | + |
| 32 | + |
| 33 | + |
| 34 | +2.布尔类型的变量,都不要加is前缀,否则部分框架解析会引起序列化错误。 |
| 35 | + |
| 36 | +一般假设我们定义一个Boolean变量为isHot,按照Bean规范生成的get方法应该是isIsHot,但是我们使用IDEA来自动生成get方法时,生成的是isHot()方法, |
| 37 | + |
| 38 | +> JavaBeans规范中对这些均有相应的规定,基本数据类型的属性,其getter和setter方法是getXXX()和setXXX,但是对于基本数据中布尔类型的数据,又有一套规定,其getter和setter方法是isXXX()和setXXX。但是包装类型都是以get开头。 |
| 39 | +
|
| 40 | +```java |
| 41 | +private boolean isHot; |
| 42 | +public boolean isHot() { |
| 43 | + return isHot; |
| 44 | +} |
| 45 | +public void setHot(boolean hot) { |
| 46 | + isHot = hot; |
| 47 | +} |
| 48 | +``` |
| 49 | + |
| 50 | +这样子在实例对象转json时,序列化框架看到isHot()方法会去找hot实例变量,这样就会找不到变量值。 |
| 51 | + |
| 52 | +在与前端交互时,同意需要注意,避免Boolean类型参数是is前缀开头的,因为Spring MVC在接受参数时,看到前端json传过来的值是isHot,而set方法中没有setIsHot()方法,只有setHot()方法 |
| 53 | + |
| 54 | +https://www.cnblogs.com/goloving/p/13086151.html |
| 55 | + |
| 56 | +https://blog.csdn.net/qq_31145141/article/details/71597608 |
| 57 | + |
| 58 | +##### 正确的加锁方式 |
| 59 | + |
| 60 | +通过这种方式来加锁,保证抛出异常时可以正常解锁,同时lock()方法不能在try代码块中调用,防止线程还没有加上锁时抛出异常,然后进行解锁,抛出IllegalMonitorStateException异常(对未加锁对象调用释放锁tryRelease()方法就会抛这个异常)。 |
| 61 | + |
| 62 | +```java |
| 63 | +Lock lock = new XxxLock(); // ... |
| 64 | +lock.lock(); |
| 65 | +try { |
| 66 | + doSomething(); |
| 67 | + doOthers(); |
| 68 | +} finally { |
| 69 | + lock.unlock(); |
| 70 | +} |
| 71 | +``` |
| 72 | + |
| 73 | +##### COUNT(*)与count(列名) |
| 74 | + |
| 75 | +1.【强制】不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的标 准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。 |
| 76 | + 说明:count(*)会统计值为 NULL 的行,而 count(列名)会将NULL值排除掉,不会统计此列为 NULL 值的行。 |
| 77 | + |
| 78 | +2.count(distinct col) 计算该列除 NULL 之外的不重复行数 |
0 commit comments