這篇文章將為大家詳細講解有關如何進行Iterator中的Itr類的分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
創新互聯建站專注于企業成都全網營銷推廣、網站重做改版、安丘網站定制設計、自適應品牌網站建設、H5響應式網站、購物商城網站建設、集團公司官網建設、外貿網站制作、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為安丘等各大城市提供網站開發制作服務。
好,我們言歸正傳,來看看他為什么錯,錯在哪里?
先看代碼:
1
哪里錯了
很明顯,他是在第36行報錯的,也就是在遍歷完數值為3的數據報錯的。讓我們往前順順,為什么遍歷完第二個元素就報錯了,因為他遍歷完數值為3的數據后,往list里面增加了一個數值為12的數據。
那我們把遍歷里面的if判斷去掉試試,答案是肯定正確的。那我們找到了原因,也就是在遍歷的時候添加了一個元素,所以導致了他錯誤。
2
錯在哪里
我們看一下ArrayList中的源碼,他在add方法里面做了什么,導致了他在遍歷的時候報錯。
圖一:
圖二:
圖三:
圖四:
上面的四幅圖都是層級調用的關系, 也就是在執行確定按鈕的時候,先確定list數組的大小,ensureCapacityInternal方法,如果為空數組,就取ArrayList中的常量DEFAULT_CAPACITY作為容器大小,然后增加修改次數modCount,最后比較最小容量和數組長度的大小,考慮擴容的情況。從剛才的敘述來看,他只是增加修改次數modCount,并考慮是否擴容。
那我們來看一下modCount是什么,以及在哪里使用了,讓我們回到這個題目。
在第33行,在list數組上定義了一個iterator,我們跟到源碼看一下
也就是他創建了一個Itr類,而這個類包括cursor,lastRet,expectedModCount三個變量,hasNext,next,remove三個方法。
那么我們來科普一下這三個變量分別代表什么意思,cursor表示下一個要訪問元素的下標,lastRet表示上一個訪問元素的下標,expectedModCount表示期望修改次數。
next方法和remove方法在開始的地方都調用了checkForComodification方法,那該方法里面就是判斷modCount和expectedModCount次數是否一樣,如果不一樣,就拋出異常,很明顯,我們開始運行代碼時的報錯信息與該異常相吻合,那其實我們就知道了他其實是在該處拋出的異常信息導致程序報錯,那也就是modCount和expectedModCount是不一樣的。
3
斷點調試
下面我們從頭開始整理一下整個流程,斷點調試一下整個代碼。
首先他先構造一個數組,并往里面增加了1,3,2數據,在上面已經看過add方法里面有什么,在add方法里面有增加modCount的值,所以在這里modCount已經為3啦。接著定義了一個iterator,剛才我們知道啦其實也就是新建了一個Itr類,那我們看下在33行結束后,iterator的值是什么。
下一個要訪問的下標cursor為0,上一個要訪問的下標lastRet為-1,預計期望修改次數expectedModCount為3,其實也就是等于他的數組大小size,也就是3。
接著進入35行開始迭代數組,執行hasNext方法,cursor為0,不等于size,為true,繼續執行next方法,先判斷modCount(也就是3)是否與expectedModCount(也就是3)相等,答案是相等的,再輸出該數值1。
接著再進入35行開始迭代數組,執行hasNext方法,cursor為1,不等于size,為true,繼續執行next方法,先判斷modCount(也就是3)是否與expectedModCount(也就是3)相等,答案是相等的,再輸出該數值3。此處注意有if判斷。里面有add方法,modCount是要加1的,現在modCount已經變成了4。
接著再進入35行開始迭代數組,執行hasNext方法,cursor為2,不等于size,為true,繼續執行next方法,先判斷modCount(也就是4)是否與expectedModCount(也就是3)相等,答案是不相等的,拋出異常。
整個流程結束。
ArrayList是不能在遍歷的時候,在對其進行修改操作的,包括增加和刪除。也就是線程不安全的。如果在遍歷的過程中有其他線程修改了lsit,則會拋出異常,這就是fast-fail(快速失敗策略),這一策略在源碼中的體現就是在next方法的時候,會調用checkForComodification方法,通過比較modCount和expectedModCount兩者的是否相等,判斷是否在遍歷的時候,有進行修改操作,從而確定是否要拋出異常。那么在需要保證數組在遍歷的時候不進行修改操作的時候,可以優先使用iterator來遍歷。
關于如何進行Iterator中的Itr類的分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文題目:如何進行Iterator中的Itr類的分析
文章鏈接:http://m.newbst.com/article20/pjcijo.html
成都網站建設公司_創新互聯,為您提供網站設計公司、企業建站、服務器托管、響應式網站、品牌網站建設、移動網站建設
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯