本篇文章為大家展示了Java的注意事項有什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
為建湖等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及建湖網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、建湖網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!
1、 不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作,可以在fori中進(jìn)行remove/add。remove 元素請使用 Iterator 方式,如果并發(fā)操作,需要對 Iterator 對象加鎖?!緟⒖迹篽ttps://my.oschina.net/u/3955185/blog/4496726】
//正例一: Listlist = new ArrayList<>(); list.add("1"); list.add("2"); Iterator iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } } //正例二: for (int i=0;i < list.size();i++) { if (list.get(i)==2) { list.remove(i); } } //反例: for (String item : list) { if ("2".equals(item)) { list.remove(item); } }
原因:由于foreach底層是用iterator進(jìn)行遍歷,源代碼如下:
public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; }
其中checkForComodification()
具體實現(xiàn)為:
final void checkForComodification() { if (modCount != expectedModCount){ throw new ConcurrentModificationException(); } }
從源代碼可以看出,當(dāng)modCount != expectedModCount
會拋異常,使用list的remove()操作之后,modCount
會加1,但是expectedModCount
不會加1,即兩值不等,會拋異常。 使用Iterator的remove()會更改expectedModCount
的值,故需使用此方式進(jìn)行remove/add。
public void remove() { if (lastRet < 0){ throw new IllegalStateException(); } checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }
如果使用fori進(jìn)行remove/add,不會走checkForComodification()
方法,所以也可以使用fori進(jìn)行操作,如正例2。
2、Integer比較的時候,使用equals,否則當(dāng)比較的數(shù)據(jù)不在-128-127之間,比較的不是值,而是對象的引用,比較結(jié)果不是預(yù)期值。
上述內(nèi)容就是Java的注意事項有什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。