2021年12月26日
java小细节|阿里java开发手册|(持续更新)
1.ConcurrentHashMap 的key和value都不能为null

2.jdk8以下 map 循环使用entrySet,jdk8以后使用Map.forEach
1.7
Set<Map.Entry<String, String>> entryseSet=map.entrySet();
for (Map.Entry<String, String> entry:entryseSet) {
System.out.println(entry.getKey()+","+entry.getValue());
}
1.8
map.forEach((k,v) -> {
System.out.println(k);
System.out.println(v);
});
3.如果每次访问冲突概率小于 20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于 3 次。
4.日期格式化时,传入pattern中表示年份统一使用小写的y。 yyyy-MM-dd HH:mm:ss 大写的 YYYY 代表是 week in which year (JDK7 之后引入的概念),意思是当天所在的周属于的年份,一周从周日开始,周六结束, 只要本周跨年,返回的 YYYY 就是下一年
5.不要使用count(列名)或count(常量)来替代count(*),count(*)是SQL92定义的 标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
6.任何货币金额,均以最小货币单位且整型类型来进行存储。
7.浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals来判断。 (1)指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。 float a = 1.0F - 0.9F; float b = 0.9F - 0.8F; float diff = 1e-6F; if (Math.abs(a - b) < diff) { System.out.println("true"); } (2) 使用BigDecimal来定义值,再进行浮点数的运算操作。 BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); BigDecimal c = new BigDecimal("0.8"); BigDecimal x = a.subtract(b); BigDecimal y = b.subtract(c); if (x.compareTo(y) == 0) { System.out.println("true"); }
8.BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法。 equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度。
9.处理double转BigDecimal,需要注意

10.关于基本数据类型与包装数据类型的使用标准如下:

11.在使用阻塞等待获取锁的方式中,必须在try代码块之外,并且在加锁方法与try代码块之间没有任何可能抛出异常的方法调用,避免加锁成功后,在finally中无法解锁。

12.如果使用尝试机制来获取锁,需要先判断是否持有锁

13.多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService 则没有这个问题。
14.当switch括号内的变量类型为String并且此变量为外部参数时,必须先进行null判断。
15.三元运算符请注意类型

16.数据库定义,小数类型为decimal,禁止使用float和double。