集合之二:迭代器

迭代器的簡單使用

  在遍歷容器時,我們可以使用for循環或者是增強for循環,但是不同的集合結構在遍歷時,我們要針對集合特點采取不同的方式,比如List是鏈表,我們可以直接當做數組處理,但Map是Key—Value的形式,我們只有獲取了鍵名才能去遍歷集合內容。

  很麻煩對吧?

  還好JDK為我們提供了一個接口-------Iterator(迭代器),迭代器為各種容器提供了公共的操作接口。這樣使得對容器的遍歷操作與其具體的底層實現相隔離,達到解耦的效果。

  查看Iterator的API我們得知,該接口共有3個方法

?

?????? 查看API發現Collection實現了該接口,也就是說Collection的所有子實現類可使用Iterator的方法,同時在Collection中定義了一個方法iterator()

?

  使用該方法iterator(),要求容器返回一個Iterator對象。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。

  那我們如何使用迭代器呢?

  示例代碼如下,關鍵代碼的解釋說明已經在注釋部分給出,將不再做贅述。

?

示例代碼:

 1        /**
 2 
 3         * + VX:java8733 獲取更多資源
 4 
 5  */
 6 
 7 public class TestIterator {
 8 
 9    
10 
11     public static void main(String[] args) {
12 
13        List<String> list= new ArrayList();
14 
15        list.add("and");
16 
17        list.add("try");
18 
19        list.add("your");
20 
21        list.add("best");
22 
23       
24 
25        //使用迭代器,對集合Arraylist中的元素進行取出
26 
27        //調用集合的方法iterator() 獲取Iterator接口的實現類對象()
28 
29        Iterator<String> it=list.iterator();
30 
31        System.out.println(list.iterator().getClass());//打印的內容是 class java.util.ArrayList$Itr 既是我們的接口的實現類對象
32 
33         //接口實現類對象,調用方法hasNext()判斷集合中是否有元素
34 
35         boolean b = it.hasNext();
36 
37         System.out.println(b);
38 
39         //接口的實現類對象,調用方法next()取出集合中的元素
40 
41         String s = it.next();
42 
43         System.out.println("it.next()"+s);
44 
45        while(it.hasNext()){
46 
47            /*
48 
49             * 這里將不會輸出"and",因為我們調用一次hasNext,內部的指針就會指向下一個元素
50 
51             */
52 
53            System.out.println(it.next());
54 
55        }
56 
57       
58 
59     }
60 
61    
62 
63 }
64 
65  

?

會遇到的問題(并發修改異常)?

  我們來設想如下的場景: 在list集合迭代元素中,對元素進行判斷,一旦條件滿足就添加一個新元素。代碼如下

 1   /**
 2 
 3         * + VX:java8733 獲取更多資源
 4 
 5  */
 6 
 7  
 8 
 9     List<String> list2 = new ArrayList<String>();
10 
11        list2.add("abc");
12 
13        list2.add("def");
14 
15        list2.add("g");
16 
17       
18 
19        Iterator<String> it=list2.iterator();
20 
21        while(it.hasNext()){
22 
23            String str=it.next();
24 
25            if("g".equals(str)){
26 
27               //該操作會導致程序異常: ConcurrentModificationException
28 
29               List2.add("b");
30 
31            }
32 
33        }
34 
35        System.out.println(list2);

?


  這是為什么呢?我們會發現當我們使用迭代器遍歷元素的時候,?使用了集合方法修改了集合的長度,這是不允許的。程序拋出異常ConcurrentModificationException,這個異常指的是當方法檢測到對象的并發修改,但不允許這種修改時,就會拋出此異常。

????? 迭代器是依賴于集合而存在的,在判斷成功后,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫并發修改異常。

  那我們應該如何解決呢?

  首先,在迭代時,盡量不要使用集合的方法操作元素。如果要在迭代時對元素操作。我們可以通過ListIterator迭代器來操作元素。

  將上面的代碼做如下的修改:

?

?

 1  /**
 2 
 3         * + VX:java8733 獲取更多資源
 4 
 5  */
 6 
 7  
 8 
 9 ListIterator<String> it=list2.listIterator();
10 
11        while(it.hasNext()){
12 
13            String str=it.next();
14 
15            if("a".equals(str)){
16 
17               //子接口ListIterator包含add()方法
18 
19               it.add("b");
20 
21            }
22 
23        }

?

??

轉載于:https://www.cnblogs.com/lotus-wmm/p/8318129.html

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

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

相關文章

簡單使用ansible-playbook

1.使用以下命令給客戶端安裝httpd服務&#xff1a; [rootserver ~]# ansible testhost -m yum -a "namehttpd" 192.168.77.128 | SUCCESS > {"changed": true, "msg": "", "rc": 0, "results": ["Loaded …

原則

昨天例會上&#xff0c;領導分享了他最近看過的一本書《原則》。試想&#xff0c;工作上&#xff0c;生活中我的原則是什么呢&#xff1f;關于技術學習的原則。一開始的時候&#xff0c;一般都是遇到不會的再去學習&#xff0c;我一直比較喜歡帶著問題&#xff0c;這樣會學習效…

Python內置函數簡記

一、數學運算類 abs(x)求絕對值 1、參數可以是整型&#xff0c;也可以是復數 2、若參數是復數&#xff0c;則返回復數的模complex([real[, imag]])創建一個復數divmod(a, b)分別取商和余數 注意&#xff1a;整型、浮點型都可以float([x])將一個字符串或數轉換為浮點數。如果無參…

開源Java反編譯工具

Java 反編譯器 1. JD-GUI JD-GUI 是一個用 C 開發的 Java 反編譯工具&#xff0c;由 Pavel Kouznetsov開發&#xff0c;支持Windows、Linux和蘋果Mac Os三個平臺。 而且提供了Eclipse平臺下的插件JD-Eclipse。JD-GUI不需要安裝&#xff0c;直接點擊運行&#xff0c;可以反編譯j…

基于MPI的H.264并行編碼代碼移植與優化

2010 03 25基于MPI的H.264并行編碼代碼移植與優化范 文洛陽理工學院計算機信息工程系 洛陽 471023摘 要 H.264獲得出色壓縮效果和質量的代價是壓縮編碼算法復雜度的增加。為了尋求更高的編碼速度&#xff0c;集群并行計算被運用到H.264的視頻編碼計算中。分析H.264可實現并行計…

python自動取款機程序_python ATM取款機----運維開發初學(上篇)

自動取款機基本功能&#xff1a;可以存取轉賬&#xff0c;刷卡信息查詢&#xff0c;銀行卡號歷史信息查詢&#xff0c;消費記錄查詢&#xff0c;修改密碼。思維導圖如下&#xff1a;數據庫設計&#xff1a;mysql> desc balan_list; #保存賬號交易記錄option_type-----------…

java的運行參數

貼個java的運行參數&#xff1a; Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select t…

阿里服務器+Centos7.4+Tomcat+JDK部署

適用對象 本文檔介紹如何使用一臺基本配置的云服務器 ECS 實例部署 Java web 項目。適用于剛開始使用阿里云進行建站的個人用戶。 配置要求 這里列出的軟件版本僅代表寫作本文檔使用的版本。操作時&#xff0c;請您以實際軟件版本為準。 操作系統&#xff1a;CentOS 7.4Tomcat …

php輸出mysqli查詢出來的結果

php連接mysql我有文章已經寫過了&#xff0c;這篇文章主要是介紹從mysql中查詢出結果之后怎么輸出的問題。 一&#xff1a;mysqli_fetch_row(); 查詢結果&#xff1a;array([0]>小王) 查詢&#xff1a; [php] view plaincopy while ($row mysqli_fetch_assoc($result)) …

rhel mysql安裝_RHEL6.4下MySQL安裝方法及簡單配置

1.MySQL安裝方法簡介 1.rpm包yum安裝 2.通用二進制包安裝 3.源碼編譯安裝 注意&#xff1a;實驗所采用的系統平臺為&#xff1a;RHEL6.4 2.rpm ins首頁 → 數據庫技術背景&#xff1a;閱讀新聞RHEL6.4下MySQL安裝方法及簡單配置[日期&#xff1a;2014-04-08]來源&#xff1a;Li…

H.264算法的DSP移植與優化

摘要&#xff1a;在TMS320DM643平臺上實現H&#xff0e;264基檔次編碼器的移植與優化顯得格外實用和必要。基于對DSP平臺的結構特性和H&#xff0e;264的計算復雜度分析&#xff0c;主要從核心算法、數據傳輸和存儲器&#xff0f;Cache使用幾方面對H&#xff0e;264編碼器進行了…

IDA*與A*

我實在懶得寫博客了&#xff0c;直接放上來之前講課做的的PPT得了。 PPT_Source Code.zip 轉載于:https://www.cnblogs.com/zzzc18/p/8323927.html

java 子類 父類 轉換_Java子類與父類之間的類型轉換

1.向上轉換父類的引用變量指向子類變量時&#xff0c;子類對象向父類對象向上轉換。從子類向父類的轉換不需要什么限制&#xff0c;只需直接蔣子類實例賦值給父類變量即可&#xff0c;這也是Java中多態的實現機制。2.向下轉換在父類變量調用子類特有的、不是從父類繼承來的方法…

H.264視頻編解碼的代碼移植和優化

基于DSP系統開發的視頻編解碼系統&#xff0c;國內幾乎都是走的移植&#xff0c;優化的路線&#xff0c;并且移植的代碼&#xff0c;都是開源的。畢竟花費大量的人力&#xff0c;物力去開發一套自己的代碼&#xff0c;并不見得比一些成熟的開源代碼效率更高&#xff0c;健壯性更…

SublimeText2 快捷鍵

SublimeText2 快捷鍵&#xff0c;與對應功能一覽表&#xff1a; 快捷鍵功能ctrlshiftn打開新Sublimectrlshiftw關閉Sublime&#xff0c;關閉所有打開文件ctrlshiftt重新打開最近關閉文件ctrln新建文件ctrls保存ctrlshifts另存為ctrlf4關閉文件ctrlw關閉ctrlk, ctrlb切換側邊欄顯…

java-linux-eclipse配置

轉載于:https://www.cnblogs.com/sheying/p/8327517.html

n皇后問題java_經典n皇后問題java代碼實現

問題描述&#xff1a;在n*n的二維表格&#xff0c;把n個皇后在表格上&#xff0c;要求同一行、同一列或同一斜線上不能有2個以上的皇后。例如八皇后有92種解決方案&#xff0c;五皇后有10種解決方案。public class TestQueen {int n; //皇后的個數int num 0; // 記錄方案數int…

ffmpeg mplayer x264 代碼重點詳解 詳細分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 顯而易見&#xff0e;&#xff0e;&#xff0e;&#xff0c;注意a&#xff0c;b宏表達式可能引出的副作用 2 SIMD by software…

nagios監控服務器的搭建

nagios 概述&#xff1a; 開源的免費的網絡監視工具。 監控&#xff1a; windows, Linux,Unix,交換機和路由器。報警。 Nagios是插件式的結構&#xff0c;它本身沒有任何監控功能&#xff0c;所有的監控都是通過插件進行的&#xff0c;因此其是高度模塊化和富于彈性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜歡鉆研問題的JS同學&#xff0c;最近又迷上了對加密方法的思考。一天&#xff0c;他突然想出了一種他認為是終極的加密辦法&#…