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

您的位置:首頁技術文章
文章詳情頁

java迭代器移除元素出現并發修改異常的原因及解決

瀏覽:27日期:2022-08-20 09:06:54

迭代器(Iterator的對象)主要用于遍歷集合,體現的就是迭代器模式。

Iterator接口定義了以下四種方法。

boolean hasNext():如果集合還沒遍歷完就返回true。

Object next():返回集合里的下一個元素。

void remove():刪除集合里上一次next方法返回的元素。

void forEachRemaining(Consumer action):這是java8新增的默認方法,可用Lambda表達式遍歷數組。

使用迭代器遍歷元素時不能不能通過Collection接口中的remove方法刪除元素,只能用Interator的remove方法刪除元素,下面根據案例和源代碼分析原因。

public class InteratorTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add('zhangsan'); list.add('lisi'); list.add('wangwu'); list.add('zhaoliu'); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next();//java.util.ConcurrentModificationException并發修改異常 System.out.println(str); if('lisi'.equals(str)) { list.remove(str); } } System.out.println(list); }}

并發修改異常: 當方法檢測到對象的并發修改,但不允許這種修改時,拋出此異常。例如,某個線程在 Collection 上進行迭代時,通常不允許另一個線性修改該 Collection(來自java API),從這里可以看出迭代器和集合是在不同線程里的。

查看資料知道了,迭代器其實在另外一個線程復制了一個一摸一樣的集合進行遍歷的。當用集合的remove方法刪除元素時,迭代器是不會知道的,所以就會拋出異常。

下面看源碼分析。

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]; }

而用迭代器的ramove方法刪除元素時,實際在底層還是用的集合的remove方法,所以迭代器和集合修改元素的次數一樣是不會出現異常的。

源碼如下:

public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet);//用的還是集合的remove方法 cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }

并發修改異常出現的原因已經找到了。但是Arraylist迭代器會出現下面這種情況,當我們用集合刪除方法刪除倒數第二個元素時,并不會出現異常。

public class InteratorTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add('zhangsan'); list.add('lisi'); list.add('wangwu'); list.add('zhaoliu'); Iterator<String> it = list.iterator(); while(it.hasNext()) { String str = it.next();//不會出現并發修改異常 System.out.println(str); if('wangwu'.equals(str)) {//用集合Remove方法刪除倒數第二個元素 list.remove(str); } } System.out.println(list); }}

原因是這樣的,當while循環到第三次的時候也就是遍歷到“wangwu”時,這時候迭代器的cursor(游標相當于指針)變量值為2,集合元素個數為4。執行完it.next()方法后cursor值為3,接著刪除“wangwu”這個元素后,集合的size變成了3。當繼續第四次循環時現判斷hasNext()當cursor值和size值相等時返回false,所以不會執行while循環里面的語句,自然不會執行next()方法,所以時不會出現異常的。

public boolean hasNext() { return cursor != size;//根據上面的說法在循環第四次是返回的是false,不會執行循環里的的代碼 }

補充知識:java使用迭代器刪除元素_使用Java從地圖中刪除元素

關于從Java中的Map刪除元素的非常簡短的文章。 我們將專注于刪除多個元素,而忽略了您可以使用Map.remove刪除單個元素的Map.remove 。

以下Map將用于此帖子:

Map<Integer, String> map = new HashMap<>();map.put(1, 'value 1');map.put(2, 'value 2');map.put(3, 'value 3');map.put(4, 'value 4');map.put(5, 'value 5');

有幾種刪除元素的方法。 您可以手動遍歷代碼并將其刪除:

for(Iterator<Integer> iterator = map.keySet().iterator(); iterator.hasNext(); ) { Integer key = iterator.next(); if(key != 1) { iterator.remove(); }}

這是您無需訪問Java 8+即可執行的操作。 從Map刪除元素時,需要Iterator來防止ConcurrentModificationException 。

如果您確實有權使用Java(8+)的較新版本,則可以從以下選項中進行選擇:

// remove by valuemap.values().removeIf(value -> !value.contains('1'));// remove by keymap.keySet().removeIf(key -> key != 1);// remove by entry / combination of key + valuemap.entrySet().removeIf(entry -> entry.getKey() != 1);

removeIf是Collection可用的方法。 是的, Map本身不是Collection ,也無權訪問removeIf本身。

但是,通過使用: values , keySet或entrySet ,將返回Map內容的視圖。 該視圖實現Collection允許在其上調用removeIf 。

由values , keySet和entrySet返回的內容非常重要。

以下是JavaDoc的values摘錄:

* Returns a { this map. Collection} view of the values contained in * Returns a { @link Collection} view of the values contained in map. * The collection is backed by the map, so changes to the map are * reflected in the collection, and vice-versa. * * The collection supports element removal, which removes the corresponding * mapping from the map, via the { @code Iterator.remove}, * mapping from the map, via the { Iterator.remove}, * { @code Collection.remove}, { @code removeAll}, * { @code retainAll} and { @code clear} operations.

此JavaDoc解釋說,由values返回的Collection由Map支持,并且更改Collection或Map都會改變另一個。 我認為我無法解釋JavaDoc所說的內容,而不是那里已經寫的內容。因此,我現在將不再嘗試該部分。 我只顯示了values的文檔,但是當我說keySet和entrySet也都由Map的內容作為后盾時,您可以信任我。 如果您不相信我,可以自己閱讀文檔。

這也使用舊版 Java版本鏈接回第一個示例。 該文檔指定可以使用Iterator.remove 。 這是早先使用的。 此外, removeIf的實現與Iterator示例非常相似。 討論完之后,我不妨展示一下:

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;}

還有一些額外的東西。 但是,否則幾乎是相同的。

就是這樣。 除了讓我記住要告訴您的記住以外,沒有太多結論了:使用values , keySet或entrySet將提供對removeIf訪問,從而允許輕松刪除Map條目。

以上這篇java迭代器移除元素出現并發修改異常的原因及解決就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩一区二区三免费高清| 国模精品一区| 亚洲午夜黄色| 日韩和的一区二在线| 精品国产欧美日韩| 精品国产91| 桃色av一区二区| 久久精品播放| 日韩午夜在线| 欧美日韩视频| 亚洲欧美视频一区二区三区| 亚洲主播在线| 亚洲精品九九| 欧美一区91| 欧美成人一二区| 国产精品精品国产一区二区| 亚洲最新无码中文字幕久久| 久久精品在线| 乱人伦精品视频在线观看| 亚洲综合激情在线| 久久国产麻豆精品| 国产不卡av一区二区| 日本精品不卡| 国产农村妇女精品一区二区| 亚洲精品一二| 麻豆精品在线观看| 日韩一区二区三区免费播放| 激情91久久| 日韩精品中文字幕吗一区二区| 国产精品调教视频| 偷拍精品精品一区二区三区| 国产精品色网| 久久av影视| 婷婷亚洲综合| 日韩av电影一区| 久久精品一区二区国产| 久久婷婷丁香| 偷拍亚洲精品| 手机在线电影一区| 国产亚洲午夜| 久久国产视频网| 免费污视频在线一区| 免费成人在线观看| 欧美成人一二区| 亚洲国产不卡| 国产欧美自拍一区| 日本а中文在线天堂| 热久久久久久久| 国产一区二区色噜噜| 国产精品美女| 国产aⅴ精品一区二区三区久久| 欧美日韩国产欧| 精品欧美一区二区三区在线观看| 一区二区三区四区日韩| 精品视频一区二区三区在线观看| 图片区亚洲欧美小说区| 国产欧美另类| 99国产精品99久久久久久粉嫩| 国产精品www.| 国产农村妇女精品一区二区 | 国产中文欧美日韩在线| 午夜精品一区二区三区国产| 国产精品www.| 免播放器亚洲一区| 国产盗摄——sm在线视频| 影音先锋久久精品| 日韩黄色大片| 日韩va欧美va亚洲va久久| 日韩高清欧美| 国产欧美日韩精品高清二区综合区| 国产综合激情| 精品国产中文字幕第一页 | 日韩精品久久久久久久电影99爱| 日韩超碰人人爽人人做人人添| 伊人久久大香线蕉av不卡| 国产精品综合色区在线观看| 国产日韩综合| 欧洲亚洲一区二区三区| 欧美一区二区三区久久精品| 欧美日韩国产亚洲一区| 亚洲深夜视频| 国产精品a久久久久| 亚洲一区二区三区免费在线观看| 国产伊人久久| 日本一区二区三区视频在线看| 欧美亚洲国产激情| 精品国产精品久久一区免费式| 日韩国产一区二| 久久午夜视频| 黄色不卡一区| 丝袜av一区| 日本蜜桃在线观看视频| 久久麻豆视频| 7777精品| 日韩高清一区在线| 午夜一区在线| 蜜臀av免费一区二区三区| 国内精品亚洲| 国产精品1区| 欧美日韩亚洲一区三区| 伊人精品久久| 免费成人性网站| 亚洲尤物在线| 欧美精品一区二区久久| 日本高清不卡一区二区三区视频| 国产在线一区不卡| 久久精品一区二区国产| 国产精品日本一区二区三区在线| 亚洲综合小说| 蜜桃传媒麻豆第一区在线观看 | 久久精品高清| 亚洲精品一级二级| 国产h片在线观看| 久久尤物视频| 精品久久中文| 国产精品xx| 国产理论在线| 成人日韩精品| 日本精品影院| 久久精品亚洲欧美日韩精品中文字幕| 色网在线免费观看| 久久久久国产| 免费观看不卡av| 欧美精品黄色| 亚洲欧美日韩一区在线观看| 亚洲一级黄色| 好吊一区二区三区| 好吊日精品视频| 久久福利一区| 亚洲精品伊人| 欧美综合精品| 国产欧美日韩免费观看| 久久成人av| 麻豆高清免费国产一区| 精品国产中文字幕第一页| 福利一区二区| 久久国产免费| 亚洲主播在线| 97久久精品| 欧美国产日本| 国产色播av在线| 日韩不卡视频在线观看| 激情综合自拍| 免费成人在线影院| 国产欧美日韩亚洲一区二区三区| 欧美激情一区| 国产成人精品亚洲日本在线观看| 久久在线免费| 日韩精品一二区| 久久国产免费看| 精品一区二区三区中文字幕在线| 日韩av片子| 欧美日韩国产在线观看网站| 国户精品久久久久久久久久久不卡| 波多视频一区| 亚洲精品九九| а√天堂中文在线资源8| 亚洲色图网站| 视频一区二区三区中文字幕| 激情久久婷婷| 精品中文一区| 激情五月综合| 国产 日韩 欧美一区| 欧美黄色精品| 欧美国产精品| 亚洲一区观看| 国模大尺度视频一区二区| 国产精品极品国产中出| 日韩精品网站| 另类综合日韩欧美亚洲| 国产视频一区三区| 亚洲69av| 免费在线看一区| 精品五月天堂| 中文字幕乱码亚洲无线精品一区| 久久国产三级| 1000部精品久久久久久久久| 欧美国产91| 日韩欧美久久| 精品99久久| 麻豆成人91精品二区三区| 美女av一区| 国产精品精品| 国产精品久久久久蜜臀| 久久午夜影院| 欧美日韩亚洲国产精品| 视频一区在线播放| 97久久超碰| a国产在线视频| 欧美亚洲专区| 国产精品美女在线观看直播| 国产亚洲精品精品国产亚洲综合| 欧美亚洲专区| 国产一区二区三区黄网站| 久久蜜桃精品| 在线免费观看亚洲| 国产视频一区二区在线播放| 国产福利电影在线播放| 久久性天堂网| 久久不见久久见免费视频7 |