Java踩坑历程

Integer缓存坑

1.默认情况下Integer.valueOf(int i)方法,假如i的值在[-128, 127]的区间内,则返回值由IntegerCache.cache产生,相同的参数值会返回同一个Integer对象,故可以使用==比较。

2.而Java的自动装箱机制,内部调用的也是Integer.valueOf(int i)方法,故由Java自动装箱的该区间内的值的Integer对象,也可以用==比较;

3.但使用构造方法new Integer(int i)创建的Integer对象,即便其值处于该区间内,也不能用==比较。Long对象同理。

迭代坑

不能在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁

Map集合坑

集合类 Key Value Super Remark
ConcurrentHashMap 不允许为null 不允许为null AbstractMap 分段锁技术
HashMap 允许为null 允许为null AbstractMap 线程不安全
Hashtable 不允许为null 不允许为null Dictionary 线程安全
TreeMap 不允许为null 允许为null AbstractMap 线程不安全

线程坑

线程池不允许使用 Executors 去创建,而是通过new ThreadPoolExecutor的方式,这样可以使得线程池运行规则更加清晰,避资源耗尽风险。

Executors创建的线程池对象的弊端

  • FixedThreadPool和SingleThreadPool:等待队列的长度为Integer.MAX_VALUE(可以看作无界),可能会堆积大量的请求,从而导致OOM。
  • CachedThreadPool和ScheduledThreadPool:允许创建线程数上限为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

SimpleDateFormat 是线程不安全的类,一般不要定义为static变量,如果定义为static,必须加锁,或者使用ThreadLocal辅助,或者使用DateUtils工具类
如果是JDK8的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替Simpledateformatter。

private static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd";
private static final ThreadLocal df = new ThreadLocal() {
    @Override
    protected DateFormat initialValue() {
        return new SimpleDateFormat(DEFAULT_DATE_PATTERN);
    }
};

你可能感兴趣的:(java)