从紧张的工作中抽出来闲暇之余学习巩固下知识
丰富自己不断提升。
1. Object的equals方法容易抛出空指针异常,应使用常量或确定有值的对象来调用equals方法。
正例:"test".equals(object);
反例:object.equlas("test");
说明:推荐使用java.util.Objects#equals(JDK7引入的工具类)
2. 不要在foreach循环里进行元素的remove/add操作>,remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
正例:
Iterator<String> it = a.iterator();
while (it.hasNext()) {
String temp = it.next();
if(删除元素的条件) {
it.remove();
}
}
反例:
List<String> a = new ArrayList<String>();说明:试着执行以上代码的结果。
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。