【Java基礎】List迭代并修改時出現的ConcurrentModificationException問題

現在有一個需求,要遍歷一個List,假設List里面存儲的是String對象,然后該需求事判斷里面如果有某個對象,則添加一個新的對象進去。自然,我們得出下面的代碼:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** Created by lili on 15/11/13.*/
public class Test {public static void main(String[] args) {List list = new ArrayList();list.add("lucy");list.add("polo");list.add("shery");//Exception in thread "main" java.util.ConcurrentModificationExceptionIterator it = list.iterator();while (it.hasNext()){String str = (String)it.next();if(str.equals("polo")){list.add("pony");}}}
}

但是該段代碼會報錯:ConcurrentModificationException,在API中查詢這個異常,解釋如下:

public class ConcurrentModificationException
extends RuntimeException
當方法檢測到對象的并發修改,但不允許這種修改時,拋出此異常。例如,某個線程在 Collection 上進行迭代時,通常不允許另一個線性修改該 Collection。通常在這些情況下,迭代的結果是不確定的。如果檢測到這種行為,一些迭代器實現(包括 JRE 提供的所有通用 collection 實現)可能選擇拋出此異常。執行該操作的迭代器稱為快速失敗 迭代器,因為迭代器很快就完全失敗,而不會冒著在將來某個時間任意發生不確定行為的風險。注意,此異常不會始終指出對象已經由不同 線程并發修改。如果單線程發出違反對象協定的方法調用序列,則該對象可能拋出此異常。例如,如果線程使用快速失敗迭代器在 collection 上迭代時直接修改該 collection,則迭代器將拋出此異常。注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證。快速失敗操作會盡最大努力拋出 ConcurrentModificationException。因此,為提高此類操作的正確性而編寫一個依賴于此異常的程序是錯誤的做法,正確做法是:ConcurrentModificationException 應該僅用于檢測 bug。從以下版本開始:
1.2

從這個異常的說明來看,這種異常還不單單對List,是對所有的Collection容器(List,Set),如果在迭代的時候有修改,則都會出現。

那怎樣才能解決這個問題呢?

  1. 用迭代器自身去添加對象,但是要利用ListIterator進行添加:Iterator只有hashNext,next和remove方法,而ListIterator有add和向前遍歷的方法。
  2. 改用for循環來遍歷判斷并添加。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;/*** Created by lili on 15/11/13.*/
public class Test {public static void main(String[] args) {List list = new ArrayList();list.add("lucy");list.add("polo");list.add("shery");//Exception in thread "main" java.util.ConcurrentModificationException
//        Iterator it = list.iterator();
//        while (it.hasNext()){
//            String str = (String)it.next();
//            if(str.equals("polo")){
//                list.add("pony");
//            }
//        }
ListIterator listIt = list.listIterator();while (listIt.hasNext()){String str = (String) listIt.next();if(str.equals("polo")){listIt.add("pony");}if(str.equals("shery")){listIt.add("keity");}}System.out.println(list);for(int i = 0; i < list.size(); i++){if(list.get(i).equals("polo")){list.add("pony");}if(list.get(i).equals("shery")){list.add("keity");}}System.out.println(list);}
}

但是從打印的結果來看,這兩種添加還是有區別的,第一種方式是在當前遍歷元素后面添加,第二種是在最后面追加。

[lucy, polo, pony, shery, keity]
[lucy, polo, pony, shery, keity, pony, keity]Process finished with exit code 0

?

轉載于:https://www.cnblogs.com/gslyyq/p/4964975.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397258.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397258.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

tp5框架原理詳解_TP5框架安全機制實例分析

本文實例講述了TP5框架安全機制。分享給大家供大家參考&#xff0c;具體如下&#xff1a;防止sql注入1、查詢條件盡量使用數組方式&#xff0c;具體如下&#xff1a;$wheres array();$wheres[account] $account;$wheres[password] $password;$User->where($wheres)->f…

碧藍航線8.20服務器維護,碧藍航線半人馬來襲 8.20更新公告

半人馬來襲&#xff01;碧藍航線將于8月20日9:00~11:00對安卓、iOS全港區進行為期2小時的改造建設&#xff0c;維護后將開啟限時活動「盛夏的半人馬座」&#xff0c;一起來看看吧。一、內容新增1.開啟限時活動「盛夏的半人馬座」&#xff0c;活動時間8月20日維護后~8月30日&…

MySQL安裝與設置

下載zip&#xff0c;配置 1&#xff0c;系統變量添加&#xff1a;...\mysql-5.7.10-winx64,環境變量添加&#xff1a;%MYSQL_HOME%\bin 2&#xff0c;修改MySQL.ini basedir&#xff08;同系統變量路徑&#xff09; datadir&#xff08;系統變量路徑\data&#xff09; port 33…

后端把Long類型的數據傳給前端,前端可能會出現精度丟失的情況,以及解決方案...

后端把Long類型的數據傳給前端&#xff0c;前端可能會出現精度丟失的情況。例如&#xff1a;201511200001725439這樣一個Long類型的整數&#xff0c;傳給前端后會變成201511200001725440。 解決方法&#xff1a; 方法一&#xff1a;在后臺將這個Long類型的字段轉換成String類型…

傳奇服務端各文件用途說明

MirServer(服務器目錄)├DBServer(數據庫服務端)│ ├Connection│ ├FDB(人物數據庫&#xff0c;數據庫格式為傳奇自定義格式)│ ├Log(角色選擇服務端日志)│ ├!AddrTable.txt(IP地址配置)│ ├!IdList.txt(交費賬號列表&#xff0c;!Setup.exe中ServiceModeTRUE時起作用)│…

認證服務器協議,基于口令的客戶端/服務器認證協議

摘要&#xff1a;Identity authentication is the precondition for secure communication between the client and the server. Kim and Chung presented a mutual authentication scheme for client/server scene. The authors realized the mutual authentication with the …

印章仿制工具_仿制圖章工具怎么用

在日常生活中&#xff0c;有時候我們需要帳單表格上的文字&#xff0c;用PS的防制圖章工具&#xff0c;可以十分方便快捷的處理出來。我想最恨學霸的就是學渣了吧&#xff0c;因為他們每次考試成績都是科科滿分。是家長嘴里別人家的孩子。那么今天就教學渣一個神技能&#xff0…

java日期的運用(DateUtils工具類)

public static void main(String[] args) { Date now new Date(); SimpleDateFormat sd new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("------當前時間--------&#xff1a;" sd.format(now)); //年: 加、減操作 System.out.…

1、rbac權限組件-初識, 中間件校驗1

1、權限組件rbac 1、什么是權限 1 項目與應用 2 什么是權限&#xff1f; 一個包含正則表達式url就是一個權限 who what how ---------->True or Flase 2、版本1&#xff1a;用戶表與權限url表 對應關系 # 版本1UserInforname pwdpermissionmodels.manytomany(Permissi…

html中視頻播放完后可以跳到另一個html

2&#xff1a;jquery 的例子如下$(document).ready(function(){$("#audioId").bind(ended, function(){location.href"other.html";});});轉載于:https://www.cnblogs.com/mailan/p/4972123.html

實現打印異常日志_老生常談SpringAop日志收集與處理做的工具包

場景 :使用Spring Aop攔截參數日志目前大部分做法都基本上大同小異,不想日后每個項目工程都寫一份這樣的Aop攔截處理日志的代碼,甚至代碼侵入。我想知道一些相對重要的請求方法的請求參數,響應參數,請求頭,以及內部耗時,方法是成功還是失敗等等信息。發生錯誤時我也不知道執行到…

服務器128g內存顯示64g,64g內存服務器

64g內存服務器 內容精選換一換華為云幫助中心&#xff0c;為用戶提供產品簡介、價格說明、購買指南、用戶指南、API參考、最佳實踐、常見問題、視頻幫助等技術文檔&#xff0c;幫助您快速上手使用華為云服務。接口名稱GetCloudPhoneServerModelsGetCloudPhoneServerModels功能描…

[LeetCode]--71. Simplify Path

Given an absolute path for a file (Unix-style), simplify it. For example, path “/home/”, > “/home” path “/a/./b/../../c/”, > “/c” click to show corner cases. Corner Cases: Did you consider the case where path “/../”? In this case, …

IOPLL動態重配

連接 Avalon -MM接口 mgmt_waitrequest:當 PLL 重配置進程開始后&#xff0c;此端口變高并在 PLL 重配置期間保持高電平。 PLL 重配置進程完成后&#xff0c;此端口變低。 I/O PLL重配寫操作步驟&#xff1a; 1、 為mgmt_address和mgmt_writedata設置有效值&#xff0c;并且…

android 的屬性動畫

public void zyluoti(View v){ValueAnimator animator ValueAnimator.ofFloat(0,screenHeight - mImageView.getHeight());//設置屬性動畫的值&#xff0c;值的類型為floatanimator.setDuration(1000);//動畫的作用時間animator.setTarget(mImageView);//設置動畫的作用目標an…

qt中如何模擬按鈕點擊_如何快速在 Shopify 中加入按鈕

假如你會 CSS , HTML , JS 三件套&#xff0c;那么修改 Shopify 代碼將不會太難&#xff08;畢竟一個模板中的代碼量還是挺多的&#xff0c;除非深入研究了代碼&#xff0c;不然改起來還是會比較麻煩的&#xff09;。但挺多玩家是不會這三件套的&#xff0c;修改代碼來達到添加…

clear ,refresh,free

itab 即是內表也是工作區的情況下&#xff0c;即with header line. clear itab&#xff0c;僅清空HEADER LINE&#xff0c;對內表數據存儲空間不影響&#xff0c;保留內存區。 refresh itab&#xff0c;不清空HEADER LINE&#xff0c;清除內表數據存儲空間&#xff0c;但保存內…

淺談關于java中的深淺拷貝

一.淺拷貝(shallow copy) 1.如何實現淺拷貝? Object類 是所有類的直接或間接父類,Object中存在clone方法,如下 protected native Object clone() throws CloneNotSupportedException; 如果想要使一個類的對象能夠調用clone方法 ,則需要實現Cloneable接口, 并重寫 clone方法: p…

iOS開發-Protocol協議及委托代理(Delegate)傳值

前言&#xff1a;因為Object&#xff0d;C是不支持多繼承的&#xff0c;所以很多時候都是用Protocol&#xff08;協議&#xff09;來代替。Protocol&#xff08;協議&#xff09;只能定義公用的一套接口&#xff0c;但不能提供具體的實現方法。也就是說&#xff0c;它只告訴你要…

git 查看分支編碼_12個常用的Git命令,趕緊記一波!

今天齊姐簡單講下 Git 的實現原理&#xff0c;知其所以然才能知其然&#xff1b;并且梳理了日常最常用的 12 個命令&#xff0c;分為三大類分享給你。本文的結構如下&#xff1a;作者和開發原由Git 的數據模型常用命令資源推薦作者和開發原由Talk is cheap. Show me the code.這…