从紧张的工作中抽出来闲暇之余学习巩固下知识
丰富自己不断提升。
1. Object的equals方法容易抛出空指针异常,应使用常量或确定有值的对象来调用equals方法。
正例:"test".equals(object);
反例:object.equlas("test");
说明:推荐使用java.util.Objects#equals(JDK7引入的工具类)
2. 不要在foreach循环里进行元素的remove/add操作>,remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
正例:
Iterator it = a.iterator();
while (it.hasNext()) {
String temp = it.next();
if(删除元素的条件) {
it.remove();
}
}
反例:
List a = new ArrayList();
a.add("1");
a.add("2");
for (String temp : a) {
if ("1".equals(temp)) {
a.remove(temp);
}
}
说明:试着执行以上代码的结果。
3. 高度注意Map类集合K/V能不能存储null的情况:
集合类 | Key | Value | Super | 说明 |
HashTable | 不允许为null | 不允许为null | Dictionary | 线程安全 |
ConcurrentHashMap | 不允许为null | 不允许为null | AbstractMap | 分段锁技术 |
TreeMap | 不允许为null | 允许为null | AbstractMap | 线程不安全 |
HashMap | 允许为null | 允许为null | AbstractMap | 线程不安全 |
null值时会抛出NPE异常。
4. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程
说明:使用线程的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。
如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或着“过度切换”的问题。
5. 线程池不允许用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更
加明确线程池的运行规则,规避资源耗尽的风险。
说明:
1)FixedThreadPool和SingleThreadPool:
允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM(内存溢出)。
2)CacheThreadPool和ScheduledThreadPool:
允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
6. 表达异常分支时,少用if-else语句,这种方式可以改成:
if (condition) {
...
return obj;
}
//接着写else的业务逻辑代码
说明:如果非要使用if()...else if()...else...方式表达逻辑,避免后续代码维护困难,请勿超过3层。
正例:逻辑上超过3层的if-else代码可以使用卫语句,或状态模式来实现。卫语句示例:
public void today() {
if (isBusy) {
System.out.println("change time.");
return;
}
if (isFree()) {
System.out.println("go to travel.");
return;
}
System.out.println("stay at home to learn Alibaba Java Coding Guideline");
return;
}
7. 循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、获取数据库连接,进行不必要的try-catch操作
(这个try-catch是否可以移至循环体外)。
【阿里巴巴Java开发手册-规范你我】