面向对象规范
避免通过类的对象访问类的静态变量或静态方法
所有的覆盖方法使用@Override
equals方法容易抛出空指针异常,应该使用Objects.equals
Integer对象比较,使用equals方法来比较
浮点数之间的等值判断,基金数据类型不能用==,包装类型不能用equals
BigDecimal的等值比较使用compareTo
禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象
所有的POJO和RPC调用必须使用包装数据类型
变更serialVersionUID需要考虑兼容性,新增属性时请不要修改值
构造中的业务逻辑放入init方法中
split方法需要对最后一个分隔符后有无内容进行检查,否则会出现下标越界风险
勿使用Object的clone方法来拷贝对象
集合规范
重写equals必须重写hashcode
String因为重写了hashcode和equals,所以可以将String对象作为key来使用
ArrayList的subList方法返回是内部类SubList,强转为ArrayList会抛出异常
Map的keyset、values、entrySet方法,不可对其进行添加元素操作,否则抛出UnsupportOperationException异常
集合转数组:list.toArray(new String[0])
不要在foreach循环中对元素进行add/remove操作(建议使用iterator)
比较实现类需要满足:可逆性、传递性
Map不能kv不能存储null的情况
hashtable:kv都不允许为null、线程安全
concurrentHashMap:kv都不允许为null,锁分段技术
treemap:key不允许为null,value允许为null,线程不安全<br>
hashmap:kv都允许为null,线程不安全<br>
合理利用有序和稳定
arraylist:order/unsort
hashmap: unorder/unsort
treeset: order/sort
并发规范
资源驱动类、工具类、单例工厂需要注意线程安全问题
创建线程或者线程池请指定有意义的线程名称
线程资源必须有线程池提供
通过ThreadPoolExecutor来创建线程池
时间工具类的替换
SimpleDateFormat->DateTimeFormatter
Instant代替Date
ThreadLocal变量的清理
及时清理自定义ThreadLocal变量
获取锁的方式
1. tryLock
2. try语句
3. finally:unlock
乐观锁悲观锁
如果每次访问的冲突概率小于20%,推荐使用乐观锁
资金相关使用悲观锁:一锁二判三更新四释放
volitale
使用volatile修饰双重校验锁对象
如果是多写情况使用LongAdder进行加减操作