一 接口类中的方法和属性不要加任何修饰符号(public 也不要加)
正例:void f ();
二 方法参数在定义和传入时,多个参数逗号后面必须加空格
method("a", "b", "c");
三 所有的重写方法,必须加@Override注解
四 所有相同类型的包装类对象之间值得比较,全部使用equals方法比较
五 关于基本数据类型与包装数据类型的使用标准如下:
- 所有的POJO类属性必须使用包装数据类型
- RPC方法的返回值和参数必须使用包装数据类型
- 所有的局部变量使用基本数据类型
六 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在init方法中
七 使用索引访问用String的split方法得到的数组时,需做最后一个分隔符后有无内容的检查,否则会抛出IndexOutOfBoundsException
说明:
String str = "a,b,c,,";
String[] ary = str.split(",");
// 预期大于3,结果是3
System.out.println(ary.length);
八 慎用Object的clone方法来拷贝对象
说明:对象的clone方法默认是浅拷贝。若要想实现深拷贝需要重写clone方法实现属性对象的拷贝
九 关于hashcode和equals的处理,遵循如下规则:
- 只要重写equals,就必须重写hashCode
- 因为Set存储的是不重复的对象,依据hashcode和equals进行判断,所以Set存储的对象就必须重写这两个方法。
- 如果自定义对象作为map的键,那么必须重写hashCode和equals。
说明: String重写了hashCode和equals方法,所以我们可以非常愉快地使用String对象作为key来使用。
十 ArrayList的subList结果补课强转成ArrayList,否则会抛出ClassCastException异常。
说明:subList返回的是ArrayList的内部类SubList,并不是ArrayList。
十一 使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的类型完全一样的数组,大小就是list.size();
十二 使用工具类Arrays.asList()把数组转换成集合时,不能使用期修改集合的相关的方法,他的add/remove/clear方法会出抛出UnsupportedOperationException异常。
说明:asList()返回的对象是一个Arrays内部类,并没有实现集合的修改方法.Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);
第一种情况:list.add("yangguanbao"); 运行时异常。
第二种情况:str[0] = "gujin"; 那么list.get(0)也会随之修改。
十三 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果是并发操作,需要对Iterator对象加锁。
正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
十四 推荐使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
说明:keySet其实是遍历两次,一次是转为Iterator对象,另一次是从hashMap中取出key对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是jdk8,使用Map.foreach方法。
eg:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合的集合。