OOP规约
1.避免使用类对象调用静态方法,要用类名嘟点的方式调用
2.所有覆写的方法都要加@Override注解
3.最好不用可变参数这种方式去编程
4.不要使用过时的类和方法
5.外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产
生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什
么;没接触过
6.Object的equal方法尽量不要用,要用常量或者已知确定不会为空的数字嘟点然后调用equals方法;昨天遇到了这个问题;
7.所有整型包装类比较都要用equals方法 不要用==前面已经说过了记住两套 整型包装类用equals比较;在-128到127之间 可以==是true 超过这个范围就未必了。记住记住;7-15中 有具体解释
8.浮点数之间的等值判断,基本数据类型不用== ,包装类不用equals
推荐使用两种方式第一,可以设置一个极小值 当他们的比值小于这个数的时候就认为相等
第二种 我能理解的就是使用BigDecimal这个类 ,具体用到了再学吧
9.DO类对象的属性要和数据库中的属性相同;数据库中 的 bigint必须和类中的Long对应;
10.为了防止精度丢失禁止使用BigDecimal的构造方法将double传进去,最好是传入的参数类型为String;要不就BigDecimal bd = new BigDecimal(“1.22323”)或者
BigDecimal bd = BigDecimal.valueOf(1.232123)这个也可以,valueOf内部是toString方法,就是把double的后面的零截取了转换为一个String返回;
11.所有POJO类型和RPC类都需要使用包装数据类型,记住就行了,应为查询数据库的时候有可能返回null,如果使用基本数据类接收 就会出现NPE;
12.序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果
完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。不懂以后遇到再说
13.构造方法中不要加入业务逻辑,需要添加业务逻辑的时候定一个init()方法;
14.POJO 类必须写 toString 方法。使用 IDE 中的工具:source> generate toString时,如果继承了另一个 POJO 类,注意在前面加一下 super.toString。说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排查问题。
15.POJO类中不能同时有isxxx()和getxx()方法;
16.使用索引访问用 String 的 split 方法得到的数组时,需做最后一个分隔符后有无内
容的检查,否则会有抛 IndexOutOfBoundsException 的风险。
17.循环体内的字符串连接应该使用StringBuilder类的append方法进行拼接,如果用循环+的方式进行拼接,那么每次+的时候都会从内部产生一次StringBuilder,造成了内存的浪费
18.final 可以声明类、成员变量、方法、以及本地变量,下列情况使用 final 关键字:
他说可以也没说必须
1) 不允许被继承的类,如:String 类。//内部已经定好了干嘛要在这里再说一遍;
2) 不允许修改引用的域对象。//这个好理解不允许修改,还不加上
3) 不允许被覆写的方法,如:POJO 类的 setter 方法。//没遇到过啊自动生成了
4) 不允许运行过程中重新赋值的局部变量。//常量???反正常量定义了也不能改
5) 避免上下文重复使用一个变量,使用 final 可以强制重新定义一个变量,方便更好地进行重构。
19.类成员与方法访问控制从严:
1) 如果不允许外部直接通过 new 来创建对象,那么构造方法必须是 private。
2) 工具类不允许有 public 或 default 构造方法。
3) 类非 static 成员变量并且与子类共享,必须是 protected。
4) 类非 static 成员变量并且仅在本类使用,必须是 private。
5) 类 static 成员变量如果仅在本类使用,必须是 private。
6) 若是 static 成员变量,考虑是否为 final。
7) 类成员方法只供类内部调用,必须是 private。
8) 类成员方法只对继承类公开,那么限制为 protected。
集合处理
1.equals和hashcode方法:只要覆写了equals必须覆写hashcode;set存储对象必须覆写这两个方法;自定义的map写需要覆写这两个方法;
2.ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常,subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍
历、增加、删除产生 ConcurrentModificationException 异常。
集合这种list视图还是第一次听说
3.使用Map的方法keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationException 异常
4.使用集合转数组的方法,必须使用集合的toArray(T[]array),传入的是类型完全一致、长度为 0 的空数组。
List list = new ArrayList<>(2);
list.add("guan");
list.add("bao");
String[] array = list.toArray(new String[0]);
5.使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList 体现的是适配器模式,只是转换接口,后台的数据仍是数组。
public static void main(String[] args) {
String[] s =new String[] {"a","b","c","d"};
List list = Arrays.asList(s);
list.stream().forEach(i-> System.out.println(i));
list.set(0,"f");
// list.add("f"); 这里就如文中所说的一样会抛出异常;
list.stream().forEach(i-> System.out.println(i));
s[0] ="a";
list.stream().forEach(i-> System.out.println(i));
}//这里可以看到只要set改变了值之后就会改变,然后数组改回来之后又编程了abcd;
6.泛型通配符<?extendsT>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用 get 方法,作为接口调用赋值时易出错。说明:扩展说一下 PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>
简单来说就是 <? extends C> 上界为 C 类型范围粗略理解为 [C,+∞),不允许添加除 null 的元素,获取的元素类型是 C ;
<? super C> 下界为 C 类型范围粗略理解为 (-∞,C],允许添加 C 以及 C 的子类类型的元素,获取的元素类型是 Object
add():编译器只知道类型是 C 或 C 的子类,所以有可能是 C D E F 其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 C 本身也不行
get():既然编译器不知道此时集合中的元素是 C D E F 的哪一个,返回类型只能是他们共同父类 C 类型。
add():编译器只知道类型是 C 或者 C 的父类,所以有可能是 A B C 其中一个类型。编译器知道下界是 C ,根据类型向上兼容所以可以添加的元素是 C 以及 C 的子类(单车可以代表车)。
get():既然编译器不确定集合类型是 A B C 的哪一种,返回类型只能是他们的共同父类 Object 。
特点:<? extends C> 的 add() 被限制,<? super C> 的 get() 被限制
7.在无泛型限制定义的集合赋值给泛型限制的集合时,在使用集合元素时,需要进行instanceof 判断,避免抛出 ClassCastException 异常。
8.不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。面试的时候遇到过一次
9.高度注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格:
集合类KeyValueSuper说明
Hashtable不允许为 null不允许为 nullDictionary线程安全
ConcurrentHashMap不允许为 null不允许为 nullAbstractMap锁分段技术(JDK8:CAS)
TreeMap不允许为 null允许为 nullAbstractMap线程不安全
HashMap允许为 null允许为 nullAbstractMap线程不安全
反例:由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储null 值时会抛出 NPE 异常。