日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java中List遍歷刪除元素remove()的方法

瀏覽:17日期:2022-08-20 13:40:04

今天碰見根據(jù)條件進(jìn)行l(wèi)ist遍歷remove的問題,第一時(shí)間就是簡單for循環(huán)remove,只知道這么寫不行,不安全,可是為什么呢?你想過嗎?下面就關(guān)于List遍歷remove的問題,深挖一下!

一、幾種常見的遍歷方式

1、普通for循環(huán)

Java中List遍歷刪除元素remove()的方法

2、高級(jí)for循環(huán)

Java中List遍歷刪除元素remove()的方法

3、iterator和removeIf

Java中List遍歷刪除元素remove()的方法

4、stream()

Java中List遍歷刪除元素remove()的方法

5、復(fù)制

Java中List遍歷刪除元素remove()的方法

6、普通for循環(huán) --> 倒序方式

Java中List遍歷刪除元素remove()的方法

二、源碼篇

1、普通for循環(huán)出錯(cuò)原因

public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) {fastRemove(index);return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) {fastRemove(index);return true; } } return false;}

/* * Private remove method that skips bounds checking and does not * return the value removed. */private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) //remove會(huì)導(dǎo)致之后的元素往前移動(dòng),而下標(biāo)不改變時(shí)就會(huì)出現(xiàn)bug System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work}

我們?cè)趧h除某個(gè)元素后,list的大小發(fā)生了變化,這時(shí)候你的的索引也會(huì)發(fā)生變化,這時(shí)就會(huì)導(dǎo)致你在遍歷的時(shí)候漏掉某些元素。比如當(dāng)你刪除第1個(gè)元素后,我們?nèi)绻€是繼續(xù)根據(jù)索引訪問第2個(gè)元素時(shí),因?yàn)閯h除的關(guān)系,后面的元素都往前移動(dòng)了一位,所以實(shí)際訪問的是第3個(gè)元素。所以這種方式可以用在刪除特定的一個(gè)元素時(shí)使用,但不適合循環(huán)刪除多個(gè)元素時(shí)使用。

2、高級(jí)for循環(huán)出錯(cuò)原因

foreach其實(shí)是用迭代器來進(jìn)行遍歷的,而在遍歷時(shí)直接使用arraylist的remove方法會(huì)導(dǎo)致什么問題呢?

可以再看一下fastremove和迭代器遍歷的內(nèi)部代碼:

Java中List遍歷刪除元素remove()的方法

Java中List遍歷刪除元素remove()的方法

最后導(dǎo)致拋出上面異常的其實(shí)就是這個(gè),簡單說,調(diào)用list.remove()方法導(dǎo)致modCount和expectedModCount的值不一致而報(bào)異常

final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException();}//調(diào)用next時(shí)會(huì)調(diào)用checkForComodification方法檢查 這兩個(gè)字段//而fastRemove里面只對(duì)modCount 進(jìn)行了改變 導(dǎo)致拋出異常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];}

所以遍歷時(shí)remove并不適用于foreach。

3、java8中新方法removeIf

//內(nèi)部其實(shí)就是迭代器遍歷default boolean removeIf(Predicate<? super E> filter) { Objects.requireNonNull(filter); boolean removed = false; final Iterator<E> each = iterator(); while (each.hasNext()) { if (filter.test(each.next())) { each.remove(); removed = true; } } return removed;}

和迭代器差不多,內(nèi)部實(shí)現(xiàn)也是迭代器。

三、總結(jié)

1、在不考慮內(nèi)存大小會(huì)不會(huì)出現(xiàn)OOM的時(shí)候,采取復(fù)制一個(gè)新的list的方法速度更快,適用于集合中對(duì)象不算多的時(shí)候,畢竟只需要add操作。

2、當(dāng)集合中元素過多時(shí),復(fù)制list就顯得有些笨重了,采用迭代器的方式進(jìn)行遍歷較快一些,并且不用關(guān)注小角標(biāo)的變化。

3、不考慮性能的時(shí)候使用removeIf方法,代碼簡潔明了。

4、當(dāng)要針對(duì)角標(biāo)進(jìn)行元素的remove時(shí),使用倒序遍歷的方式最為妥當(dāng)。

到此這篇關(guān)于Java中List遍歷刪除元素remove()的方法的文章就介紹到這了,更多相關(guān)Java List遍歷刪除元素內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩精品一区第一页| 国产高潮在线| 日韩视频免费| 国产传媒在线观看| 国产欧美日韩精品一区二区免费 | 日日摸夜夜添夜夜添国产精品| 日韩一区电影| 国产一区二区三区四区五区传媒| 日本三级亚洲精品| 伊人久久成人| 1000部精品久久久久久久久| 免费久久精品视频| 日韩激情网站| 蜜桃一区二区三区在线观看| 亚洲www啪成人一区二区| 国产精品观看| 91精品视频一区二区| 性欧美长视频| av亚洲在线观看| 成人久久一区| 日韩国产一区二区三区| 精品黄色一级片| 午夜精品福利影院| 久久午夜精品| 亚洲二区三区不卡| 麻豆91精品视频| 日本va欧美va瓶| av资源中文在线天堂| 亚洲爱爱视频| 欧美日韩激情在线一区二区三区| 精品在线99| 久久国产影院| 日本伊人久久| 国产视频网站一区二区三区| 国产高清亚洲| 日韩精品免费一区二区夜夜嗨| 国产调教精品| 国产在线日韩精品| 中文字幕成人| 免费污视频在线一区| 国产精品美女午夜爽爽| 久久久蜜桃一区二区人| 国产精品久久久免费| 日本视频一区二区| 国产色噜噜噜91在线精品| 91成人小视频| 国产精品三级| 精品一区二区三区中文字幕| 精品视频在线观看网站| 精品一区二区三区在线观看视频| 久久青青视频| 欧美日韩国产综合网| 亚洲一区欧美| 国产精品毛片久久久| 精品亚洲a∨| 欧美国产日本| 国产精品久久久久蜜臀| 四虎8848精品成人免费网站| 天堂va在线高清一区| 日韩精品一二三四| 国产精品蜜芽在线观看| 婷婷综合网站| 精品国产亚洲一区二区三区在线 | 国产精品欧美三级在线观看| 亚洲精品电影| 亚洲一级黄色| 欧美a级片一区| 亚洲欧美网站| 国产欧美一区二区三区精品观看 | 国产一区二区三区视频在线| 红桃视频国产一区| 日产欧产美韩系列久久99| 久久久久久色 | 美女亚洲一区| 久久国产生活片100| 婷婷综合五月| 国产一区2区| 亚洲精品在线a| 亚洲福利久久| 精品国产麻豆| 欧美黄色精品| 国产精品巨作av| 一本色道精品久久一区二区三区| 国产精品视频一区视频二区| 成人在线视频免费看| 国产一区二区三区日韩精品| 精品视频久久| 国产精品久久久久久久免费观看 | 免费看日韩精品| 亚洲一区欧美二区| 久久av在线| 国产毛片精品久久| 久久婷婷久久| 国产精品腿扒开做爽爽爽挤奶网站| 精品一区免费| 日本a级不卡| 国产在线日韩精品| 日韩精品第一区| 国产一级一区二区| 91麻豆精品激情在线观看最新| 国产亚洲精品美女久久| 国产精品伦理久久久久久| 国产99久久| 色婷婷成人网| 一区二区精品伦理...| 模特精品在线| 美女久久久精品| 伊人久久大香线蕉av不卡| 免费人成精品欧美精品| 国产免费播放一区二区| 日韩精品永久网址| 亚洲精品中文字幕99999| 国精品产品一区| 免费精品视频| 国产精品99视频| 亚洲精品福利| 久久毛片亚洲| 日本亚洲最大的色成网站www| 精品午夜久久| 亚洲性视频在线| 婷婷精品视频| 精品淫伦v久久水蜜桃| 久久国产精品亚洲77777| 在线国产精品一区| 精品国产欧美日韩一区二区三区| 男女男精品网站| 激情综合网五月| 精品三级在线| 97久久亚洲| 亚洲欧洲免费| 免费日韩精品中文字幕视频在线| 亚洲综合在线电影| 日韩国产91| 日韩视频中文| 成人小电影网站| 成人高清一区| 男女激情视频一区| 国产成人精品一区二区三区在线| 亚洲一区av| 亚洲综合精品| 久久国产电影| 亚洲不卡av不卡一区二区| 精品三级av| 狂野欧美性猛交xxxx| 国产欧美日韩影院| 欧美黄色一区二区| 成人在线视频免费| 日韩在线第七页| 韩国三级一区| 蜜臀久久精品| 欧美日韩少妇| 亚洲精品乱码日韩| 国产欧美日韩在线一区二区 | 国产精品日韩精品中文字幕| 日韩精品中文字幕吗一区二区| 亚洲毛片在线| 国产精品天堂蜜av在线播放| 麻豆91精品91久久久的内涵| 美女视频黄 久久| 久久久久九九精品影院| 精品伊人久久久| 一区二区小说| 亚洲性视频在线| 日韩av一区二区在线影视| 日本午夜免费一区二区| 黄色网一区二区| 激情婷婷欧美| 在线综合欧美| 久久国内精品| 色婷婷精品视频| 日韩欧乱色一区二区三区在线| 欧美一级全黄| 日韩成人高清| 日本不卡高清视频| 成午夜精品一区二区三区软件| 国产一区日韩一区| 69精品国产久热在线观看| 欧美成人午夜| 欧美一区=区| 日韩激情综合| 97人人精品| 亚洲午夜一级| 性色av一区二区怡红| 亚洲精选久久| 91大神在线观看线路一区| 日本h片久久| 国产日韩欧美在线播放不卡| 国产精品啊v在线| 精品国产亚洲日本| 久久美女性网| 亚洲三级网址| 天堂8中文在线最新版在线| 欧美综合社区国产| 蜜臀av性久久久久蜜臀aⅴ四虎 | 精品72久久久久中文字幕| 米奇777超碰欧美日韩亚洲| 久久久久久久欧美精品| 久久午夜影视| 伊人久久亚洲影院| 天堂√8在线中文|