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<String> list = new ArrayList<String>(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<String> 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();         
        }         
      }  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 集合框架: 1)特点:存储对象;长度可变;存储对象的类型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang阅读 1,320评论 0 4
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,554评论 0 3
  • 目录 一、 编程规约..................................................
    owen_he阅读 5,026评论 0 4
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 4,421评论 4 50
  • Collection接口 Collection接口是所有集合的祖先类。他有两个构造方法,一个无参构造,一个是带Co...
    夜幕繁华阅读 636评论 0 0