OOP规约
- 所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较
Integer在-128 至 127 范围内
因为IntegerCache.cache
的原因所以==
为true,但是在这个范围之外的都需要使用equals判断,否则出现false
使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无
内容的检查,否则会有抛 IndexOutOfBoundsException 的风险循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。
集合处理
- 如果自定义对象作为Map的键,那么必须重写hashCode和equals,因为String 重写了 hashCode 和 equals 方法,所以我们可以使用 String 对象 作为 key 来使用
- ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常,正确的使用方法为
List<Object> tempList = new ArrayList<Object>(list.subList(2, lists.size()));
- ArrayList.subList方法返回的只是视图,高度注意对原集合元素的增加或删除,均会导致子列表的遍历、 增加、删除产生
ConcurrentModificationException
异常 list.toArray()
方法分为有参数和无参数两个方法,无参数返回Object[]类,再强转其他类会出现ClassCastException
错误list.toArray()
最好的方法是定义一个和list数组size大小一样的数组
1 | List<String> list = new ArrayList<String>(2); |
- 使用工具类
Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出UnsupportedOperationException
异常,应为该方法返回的是Arrays类自己定义的一个内部类叫做ArrayList,所以会报错 - 最好的将Array转为List的方法是
Collections.addAll
1 | String[] str = new String[]{"you", "wu"}; |
- 不要在 foreach 循环里进行元素的 remove/add 操作,会出现ConcurrentModificationException错误,remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁
1 | Iterator<String> iterator = list.iterator(); |
- Map类集合 K/V 能不能存储 null 值的情况
异常处理
- 不要在 finally 块中使用 return,否则在try块中的return将无法执行到(try块中其他逻辑还是执行的)
MySQL数据库
- 数据库中保存小数,推荐使用decimal类型(对应java.math.BigDecimal ),禁止使用float和double类型,这两种类型存在精度缺失
- 不得使用外键与级联,一切外键概念必须在应用层解决
以学生和成绩的关系为例,学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为 级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻 塞,存在数据库更新风暴的风险;外键影响数据库的插入速度
浮点数的使用
- 在要求绝对精度表示的业务场景下,比如金融行业的货币表示,推荐使用整型存储其最小单位的值,比如人名币用分,美元用美分来表示
- 要求精确表示小数点N位的业务场景,如圆周率后1000位,那么推荐使用数组保存小数部分的数据
- 禁止通过判断2个浮点数是否相等来控制业务流程
字符集乱码
为了避免出现源码在不同操作系统中换行显示不同情况,推荐使用LF
换行方式
编码不同会造成乱码的现象,国际站推荐使用UTF-8
编码