java常見的坑

1、對(duì)于Integer var=?在-128至127之間的賦值,Integer對(duì)象是在IntegerCache.cache產(chǎn)生,會(huì)復(fù)用已有對(duì)象,這個(gè)區(qū)間內(nèi)的Integer 值可以直接使用==進(jìn)行判斷,但是這個(gè)區(qū)間之外的所有數(shù)據(jù),都會(huì)在堆上產(chǎn)生,并不會(huì)復(fù)用已有對(duì)象,這是一個(gè)大坑,推薦使用 equals方法進(jìn)行判斷。

2、ArrayList的subList結(jié)果不可強(qiáng)轉(zhuǎn)成ArrayList,否則會(huì)拋出ClassCastException。subList 返回的是 ArrayList 的內(nèi)部類 SubList,并不是 ArrayList ,而是 ArrayList 的一個(gè)視圖,對(duì)于SubList子列表的所有操作最終會(huì)反映到原列表上。在subList場(chǎng)景中,高度注意對(duì)原集合元素個(gè)數(shù)的修改,會(huì)導(dǎo)致子列表的遍歷、增加、刪除均產(chǎn)生ConcurrentModificationException 異常。

3、使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的toArray(T[] array),傳入的是類型完全一樣的數(shù)組,大小就是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()把數(shù)組轉(zhuǎn)換成集合時(shí),不能使用其修改集合相關(guān)的方法,它的add/remove/clear方法會(huì)拋出 UnsupportedOperationException異常。asList的返回對(duì)象是一個(gè)Arrays內(nèi)部類,并沒有實(shí)現(xiàn)集合的修改方法。Arrays.asList體現(xiàn)的是適配器模式,只是轉(zhuǎn)換接口,后臺(tái)的數(shù)據(jù)仍是數(shù)組。

5、不要在foreach循環(huán)里進(jìn)行元素的remove/add操作。remove元素請(qǐng)使用Iterator方式,如果并發(fā)操作,需要對(duì)Iterator對(duì)象加鎖。

  Iterator<String> it = a.iterator(); 
  while(it.hasNext()) { 
    String temp = it.next(); 
    if(刪除元素的條件) { 
        it.remove(); 
    } 
  }

6、使用entrySet遍歷Map類集合KV,而不是keySet方式進(jìn)行遍歷。keySet其實(shí)是遍歷了2次,一次是轉(zhuǎn)為Iterator對(duì)象,另一次是從hashMap中取出key所對(duì)應(yīng)的value。而entrySet只是遍歷了一次就把key和value都放到了entry中,效率更高。values()返回的是V值集合,是一個(gè)list集合對(duì)象;keySet()返回的是K值集合,是一個(gè)Set集合對(duì)象;entrySet()返回的是K-V值組合集合。

7、避免用Apache Beanutils進(jìn)行屬性的copy。Apache BeanUtils性能較差,可以使用其他方案比如Spring BeanUtils。

8、有try塊放到了事務(wù)代碼中,catch異常后,如果需要回滾事務(wù),一定要注意手動(dòng)回滾事務(wù)。

      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();         
        }         
      }  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 集合框架: 1)特點(diǎn):存儲(chǔ)對(duì)象;長度可變;存儲(chǔ)對(duì)象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,386評(píng)論 0 4
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,648評(píng)論 0 3
  • 目錄 一、 編程規(guī)約..................................................
    owen_he閱讀 5,195評(píng)論 0 4
  • 傳送門 解讀阿里Java開發(fā)手冊(cè)(v1.1.1) - 異常日志 前言 阿里Java開發(fā)手冊(cè)談不上圣經(jīng),但確實(shí)是大量...
    kelgon閱讀 4,464評(píng)論 4 50
  • Collection接口 Collection接口是所有集合的祖先類。他有兩個(gè)構(gòu)造方法,一個(gè)無參構(gòu)造,一個(gè)是帶Co...
    夜幕繁華閱讀 682評(píng)論 0 0

友情鏈接更多精彩內(nèi)容