java常见的坑

1、对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals方法进行判断。

2、ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException。subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException 异常。

3、使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。

  List list = new ArrayList(2);
  list.add("guan"); 
  list.add("bao"); 
  String[] array = new String[list.size()]; 
  array = list.toArray(array);

4、使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 UnsupportedOperationException异常。asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。

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

  Iterator it = a.iterator(); 
  while(it.hasNext()) { 
    String temp = it.next(); 
    if(删除元素的条件) { 
        it.remove(); 
    } 
  }

6、使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。

7、避免用Apache Beanutils进行属性的copy。Apache BeanUtils性能较差,可以使用其他方案比如Spring BeanUtils。

8、有try块放到了事务代码中,catch异常后,如果需要回滚事务,一定要注意手动回滚事务。

      if(userSave) {         
         try {          
            userDao.save(user);          
            userCapabilityQuotaDao.save(capabilityQuota);         
         } catch (Exception e) {         
            logger.info("能力开通接口,开户异常,异常信息:"+e);          
            throw new RuntimeException();         
         }          
      }  

或者

     if(userSave) {          
        try {          
           userDao.save(user);          
           userCapabilityQuotaDao.save(capabilityQuota);          
        } catch (Exception e) {          
           logger.info("能力开通接口,开户异常,异常信息:"+e);          
           TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();         
        }         
      }  

你可能感兴趣的:(java常见的坑)